从NavigableString访问标签

时间:2015-09-23 20:27:16

标签: python-3.x beautifulsoup

我真的不明白BeautifulSoup是如何运作的。我试过这个:

from bs4 import BeautifulSoup

def strip_del(soup):
    for d in soup.find_all('del'):
        d.decompose()

def num_there(s):
    return any(i.isdigit() for i in s)

def is_airfield(tr):
    return not num_there(tr.td.span.text)

soup = BeautifulSoup(html, 'lxml')
strip_del(soup)

for tr in soup.table.tbody:
    if is_airfield(tr):
        print('yes')
    else:
        print('no')

但是当我跑步时,我有一个错误,告诉我我无法从NaviagableString函数中的is_airfield访问 td

所以我的问题是为什么这不起作用以及如何工作BeautifulSoup?!

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

问题是您要返回NavigableString而不是tag。我将改为使用find_all方法,看看它是如何工作的。

for tr in soup.find_all("tr"):
    if is_airfield(tr):
        print('yes')
    else:
        print('no')

答案 1 :(得分:0)

你正在做的事情不起作用的原因是你的汤里面有两种物品,标签和NavigableString(可能会有更多,但我不知道那些会是什么)。正如您可能从文档中收集到的所有BeautifulSoup的汤的导航方法都可用于标记。它们不适用于NavigableStrings,它们通常也会混合在汤中。

当您搜索汤时,应确保只调用标记上可用于标记的方法,以及仅适用于NavigableStrings的方法。这可以通过使用if条件或try除块来实现。您可以通过import NavigableString测试汤中的对象是否为NavigableString,然后使用if语句中的isinstance(obj, NavigableString)方法来区分NavigableStrings和常规标记。