复杂美丽的汤查询

时间:2009-04-01 16:51:24

标签: python beautifulsoup

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

3 个答案:

答案 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>]

Documentation