以下是我正在使用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文件中的多个条件?
答案 0 :(得分:10)
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
个父级。使用适当的功能,可以提高测试效率。
答案 1 :(得分: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>]
答案 2 :(得分: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>]