規(guī)范的書寫爬蟲是十分重要的,如果某個(gè)位置出了問題就跨過去,繼續(xù)執(zhí)行。否則,你洗洗睡了,期待爬蟲在這一頁替你爬取所有信息,但是它卻報(bào)錯(cuò)退出來了。
from urllib.request import urlopen
from urllib.error import HTTPError
from bs4 import BeautifulSoup
def GetTitle(url):
try:
html=urlopen(url)
except HTTPError as e:
return None
try:
bsobj=BeautifulSoup(html,"html.parser")#這里要選擇解釋器
title=bsobj.body.h1
except AttributeError as e:
return None
return title
title=GetTitle("https://hao.lenovo.com.cn/?c=lenovo_oem")
if(title==None):
print("未找到")
else:
print(title)
Beatifulsoup中的find()和findall()
.findAll(tag, attributes, recursive, text, limit, keywords)
.find(tag, attributes, recursive, text, keywords)
tag標(biāo)簽:可以傳一個(gè)標(biāo)簽的名稱或多個(gè)標(biāo)簽名稱組成的Python列表做標(biāo)簽參數(shù)。 例如,下面的代碼將返回一個(gè)包含HTML文檔中所有標(biāo)題標(biāo)簽的列表:1.findAll({"h1","h2","h3","h4","h5","h6"} attributes屬性:用一個(gè)字典封裝一個(gè)標(biāo)簽的若干屬性和對應(yīng)的屬性值。例如,下面這個(gè)函數(shù)會(huì)返回HTML文檔里紅色與綠色兩種顏色的span標(biāo)簽:
.findAll("span", {"class":{"green", "red"}
recursive 遞歸 一般情況下默認(rèn)為True,可以手動(dòng)賦False。 如果recursive設(shè)置為True,findAll就會(huì)根據(jù)你的要求去查找標(biāo)簽參數(shù)的所有子標(biāo)簽,以及子標(biāo)簽的子標(biāo)簽。如果recursive設(shè)置為False,findAll就只查找文檔的一級標(biāo)簽 text 文本,根據(jù)文本內(nèi)容進(jìn)行匹配
nameList = bsObj.findAll(text="the prince")
limit,顯然只用于findAll方法。find其實(shí)等價(jià)于findAll的limit等于1時(shí)的情形。如果你只對網(wǎng)頁中獲取的前x項(xiàng)結(jié)果感興趣,就可以設(shè)置它。但是要注意,這個(gè)參數(shù)設(shè)置之后,獲得的前幾項(xiàng)結(jié)果是按照網(wǎng)頁上的順序排序的,未必是你想要的那前幾項(xiàng) keyword 使用指定屬性來篩選 關(guān)鍵詞參數(shù)的注意事項(xiàng): 雖然關(guān)鍵詞參數(shù)keyword在一些場景中很有用,但是,它是BeautifulSoup在技術(shù)上做的一個(gè)冗余功能。任何用關(guān)鍵詞參數(shù)能夠完成的任務(wù),同樣可以用本章后面將介紹的技術(shù)解決(請參見2.3節(jié)和2.6節(jié))。例如,下面兩行代碼是完全一樣的:
bsObj.findAll(id="text")
bsObj.findAll("", {"id":"text"})
另外,用keyword偶爾會(huì)出現(xiàn)問題,尤其是在用class屬性查找標(biāo)簽的時(shí)候,因?yàn)閏lass是Python中受保護(hù)的關(guān)鍵字。也就是說,class是Python語言的保留字,在Python程序里是不能當(dāng)作變量或參數(shù)名使用的(和前面介紹的BeautifulSoup.findAll()里的keyword無關(guān)) 2。假如你運(yùn)行下面的代碼,Python就會(huì)因?yàn)槟阏`用class保留字而產(chǎn)生一個(gè)語法錯(cuò)誤:
bsObj.findAll(class="green")
不過,你可以用BeautifulSoup提供的有點(diǎn)兒臃腫的方案,在class后面增加一個(gè)下劃線:
bsObj.findAll(class_="green")
另外,你也可以用屬性參數(shù)把class用引號包起來:
bsObj.findAll("", {"class":"green"})
看到這里,你可能會(huì)捫心自問:“現(xiàn)在我是不是已經(jīng)知道如何用標(biāo)簽屬性獲取一組標(biāo)簽了——用字典把屬性傳到函數(shù)里就行了?” 回憶一下前面的內(nèi)容,通過標(biāo)簽參數(shù)tag把標(biāo)簽列表傳到.findAll()里獲取一列標(biāo)簽,其實(shí)就是一個(gè)“或”關(guān)系的過濾器(即選擇所有帶標(biāo)簽1或標(biāo)簽2或標(biāo)簽3…的一列標(biāo)簽)。如果你的標(biāo)簽列表很長,就需要花很長時(shí)間才能寫完。而關(guān)鍵詞參數(shù)keyword可以讓你增加一個(gè)“與”關(guān)系的過濾器來簡化工作。
來源:https://www./content-4-840901.html
|