我正在使用BeautifulSoup搜索网页中的多个元素。
我正在保存我找到的元素,但是因为我的脚本有可能会查找一个元素,并且对于它正在解析的特定页面它不存在,我对每个元素都有try / except语句: / p>
# go through a bunch of webpages
for soup in soups:
try: # look for HTML element
data['val1'].append(soup.find('div', class_="something").text)
except: # add NA if nothing found
data['val1'].append("N/A")
try:
data['val2'].append(soup.find('span', class_="something else").text)
except:
data['val2'].append("N/A")
# and more and more try/excepts for more elements of interest
是否有更清洁或更好的方式来写这样的东西?
答案 0 :(得分:3)
根据find method的文档。如果找不到任何东西,它将返回None。因此,当您调用None的属性“text”时会发生异常。
也许您应该看看Python中的ternary operator,看看如何做到这一点。
dataframe
同样Dan-Dev指出catching an exception is expensive:
如果没有引发异常,try / except块非常有效。实际上捕获异常是很昂贵的。
答案 1 :(得分:2)
尝试除了昂贵。我使用if else语句。
v = soup.find('div', class_="something")
if v:
data['val1'].append(v.text)
else:
data['val1'].append("N/A")
答案 2 :(得分:1)
这实现了你想要的东西,并通过在for循环中包装东西来减少代码重复:
info= [("val1", "div", "something"),
("val2", "span", "something else")]
# go through a bunch of webpages
for soup in soups:
for (val, element, class1) in info:
query = soup.find(element, class_=class1)
data[val].append(query.text if query else "N/A")