我正在使用漂亮的湯庫從網頁中提取資料。有時我們會遇到在網頁本身中找不到元素的情況,如果我們嘗試訪問子元素,則會出現錯誤,例如“NoneType”物件沒有“查找”屬性。
就像讓我們說下面的代碼
res = requests.get(url)
soup = BeautifulSoup(res.text, "html.parser")
primary_name = soup.find('div', {"class": "company-header"}).find('p', {"class": "heading-xlarge"}).text
company_number = soup.find('p', id="company-number").find('strong').text
如果我想處理錯誤,我必須寫如下內容。
try:
primary_name = error_handler(soup.find('div', {"class": "company-header"}).find('p', {"class": "heading-xlarge"}).text)
except:
primary_name = None
try:
company_number = soup.find('p', id="company-number").find('strong').text.strip()
except:
company_number = None
如果元素太多,那么我們最終會得到很多tryandcatch陳述句。我實際上想以下面的方式撰寫代碼。
def error_handler(_):
try:
return _
except:
return None
primary_name = error_handler(soup.find('div', {"class": "company-header"}).find('p', {"class": "heading-xlarge"}).text)
# this will still raise the error
我知道上面的代碼不起作用,因為它仍然會嘗試執行函式中的第一個內部函式error_handler,并且仍然會引發錯誤。
如果你知道如何讓這段代碼看起來更干凈,那么請告訴我。
uj5u.com熱心網友回復:
我不知道這是否是最有效的方法,但您可以將 lambda 運算式傳遞給error_handler:
def error_handler(_):
try:
return _()
except:
return None
primary_name = error_handler(lambda: soup.find('div', {"class": "company-header"}).find('p', {"class": "heading-xlarge"}).text)
uj5u.com熱心網友回復:
因此,您正在尋找一種方法來處理大量元素的例外。
為此,我假設您將(像任何其他刮刀一樣)使用 for 回圈。您可以按如下方式處理例外:
soup = BeautifulSoup(somehtml)
a_big_list_of_data = soup.find_all("div", {"class": "cards"})
for items in a_big_list_of_data:
try:
name = items.find_all("h3", {"id": "name"})
price = items.find_all("h5", {"id": "price"})
except:
continue
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/523626.html
下一篇:在回圈中按類名查找元素,硒
