BeautifulSoup:如果找不到HTML元素,则返回None

时间:2018-06-02 23:18:29

标签: python beautifulsoup

我正在使用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

是否有更清洁或更好的方式来写这样的东西?

3 个答案:

答案 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")