3

这是我正在使用 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 文件中的多个条件?

4

3 回答 3

12

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

于 2009-04-01T17:15:12.780 回答
0
>>> 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>]
于 2009-04-01T17:19:33.673 回答
0
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>]

文档

于 2020-10-22T00:35:06.930 回答