BS4:标记中的注释破坏了字符串属性和搜索功能

时间:2019-01-03 16:11:00

标签: python web-scraping beautifulsoup

在BeautifulSoup4中,如果您在Tag元素上调用.string,则应返回标签内包含的文本。

但是,如果标签内有注释,则.string属性会突然返回None

尽管.text属性似乎仍然有效,但是使用据称仍在工作的find属性调用text不再起作用。 因此,如果没有评论,find有效,如果没有评论,find不起作用。

这是MWE:

from bs4 import BeautifulSoup

def test(html):
    soup = BeautifulSoup(html, 'lxml')
    tag = soup.find('span')
    print("TEXT {}: {}".format(type(tag.text), tag.text))
    print("STRING {}: {}".format(type(tag.string), tag.string))
    found = soup.find('span', text="Hello")
    print("Found: {}\n".format("Yes" if found != None else "No"))

test('<span>Hello</span>')
test('<span><!-- AA -->Hello</span>')

以下是输出:

TEXT <class 'str'>: Hello
STRING <class 'bs4.element.NavigableString'>: Hello
Found: Yes

TEXT <class 'str'>: Hello
STRING <class 'NoneType'>: None
Found: No

问题是:为什么会显示此行为,如何恢复find功能?

P.S。 find_all()不会为任何孩子返回任何孩子

1 个答案:

答案 0 :(得分:0)

如果标记只有一个window.onload = test_function(); 类型的子代,则只有outside = [inside, inside, inside, inside, inside, inside, inside, inside, inside, inside] 将起作用。参见https://www.crummy.com/software/BeautifulSoup/bs4/doc/#string

您的问题与BeautifulSoup - search by text inside a tag相同。对于您的问题,解决方案很少。