这是我正在使用 Beautiful Soup 探索的 HTML 文件的片段。
<td width="50%">
<strong class="sans"><a href="http:/website">Site</a></strong> <br />
我想<a href>
为任何包含<strong class="sans">
和 的行获取<td width="50%">
.
是否可以使用 Beautiful Soup 查询 HTML 文件中的多个条件?
这是我正在使用 Beautiful Soup 探索的 HTML 文件的片段。
<td width="50%">
<strong class="sans"><a href="http:/website">Site</a></strong> <br />
我想<a href>
为任何包含<strong class="sans">
和 的行获取<td width="50%">
.
是否可以使用 Beautiful Soup 查询 HTML 文件中的多个条件?
BeautifulSoup 的搜索机制接受一个可调用对象,文档似乎为您的情况推荐:“如果您需要对标签的属性施加复杂或互锁的限制,请传入一个可调用对象作为名称,...”。(好吧......他们正在专门讨论属性,但该建议反映了 BeautifulSoup API 的潜在精神)。
如果你想要一个单行:
soup.findAll(lambda tag: tag.name == 'a' and \
tag.findParent('strong', 'sans') and \
tag.findParent('strong', 'sans').findParent('td', attrs={'width':'50%'}))
我在此示例中使用了 lambda,但实际上,如果您有多个链式需求,您可能希望定义一个可调用函数,因为此 lambda 必须进行两次调用以避免在标记没有父标记findParent('strong', 'sans')
时引发异常。使用适当的功能,您可以使测试更有效率。<a>
strong
>>> BeautifulSoup.BeautifulSoup("""<html><td width="50%">
... <strong class="sans"><a href="http:/website">Site</a></strong> <br />
... </html>""" )
<html><td width="50%">
<strong class="sans"><a href="http:/website">Site</a></strong> <br />
</td></html>
>>> [ a for a in strong.findAll("a")
for strong in tr.findAll("strong", attrs = {"class": "sans"})
for tr in soup.findAll("td", width = "50%")]
[<a href="http:/website">Site</a>]
from bs4 import BeautifulSoup
html_doc = """<td width="50%">
<strong class="sans"><a href="http:/website">Site</a></strong> <br />
"""
soup = BeautifulSoup(html_doc, 'html.parser')
soup.select('td[width="50%"] .sans [href]')
# Out[24]: [<a href="http:/website">Site</a>]