在BS4中按文本查找HTML标签

时间:2020-10-31 23:41:31

标签: python parsing web-scraping beautifulsoup

假设我们有类似HTML的样式

<p class='cls1'> Hello </p>

因此,我想通过使用BS4搜索“ Hello” 来找到标签<p>(并且我暂时不知道该标签周围是什么标签)。

应该像

full_string = soup.find(text=re.compile('Hello'))
full_string.get_parent_tag() # <p>
full_string.get_parent_class() # cls1

在BS4中可以吗? 谢谢!

2 个答案:

答案 0 :(得分:1)

当然可以。

import re

from bs4 import BeautifulSoup


your_html = """<p class='cls1'> Hello </p>"""
print(BeautifulSoup(your_html, "html.parser").find_all(lambda t: t.name == "p" and re.compile("Hello")))

输出:

[<p class="cls1"> Hello </p>]

如果您不知道要使用的标签,可以尝试以下操作:

from lxml import html


your_html = """<p class='cls1'> Hello </p>"""
print(html.fromstring(your_html).xpath("//*[contains(text(), 'Hello')]"))

输出:

[<Element p at 0x7f2b172ae5e0>]

答案 1 :(得分:0)

要通过文本搜索标签,可以使用CSS选择器p:contains(<text>)

from bs4 import BeautifulSoup

html = """<p class='cls1'> Hello </p>"""
soup = BeautifulSoup(html, "html.parser")

print(soup.select_one('p:contains("Hello")').text)

输出:

Hello