Сложный запрос Beautiful Soup - PullRequest
3 голосов
/ 01 апреля 2009

Вот фрагмент HTML-файла, который я изучаю с Beautiful Soup.

<td width="50%">
    <strong class="sans"><a href="http:/website">Site</a></strong> <br /> 

Я хотел бы получить <a href> для любой строки, которая имеет <strong class="sans"> и которая находится внутри <td width="50%">.

Можно ли запросить файл HTML для этих нескольких условий, используя Beautiful Soup?

Ответы [ 2 ]

10 голосов
/ 01 апреля 2009

Механизмы поиска BeautifulSoup принимают вызываемый вызов, который, как представляется, документы рекомендуют для вашего случая: «Если вам нужно наложить сложные или взаимосвязанные ограничения на атрибуты тега, передайте вызываемый объект для имени, ...». (хорошо ... они конкретно говорят об атрибутах, но совет отражает основополагающий дух API BeautifulSoup).

Если вы хотите однострочник:

soup.findAll(lambda tag: tag.name == 'a' and \
tag.findParent('strong', 'sans') and \
tag.findParent('strong', 'sans').findParent('td', attrs={'width':'50%'}))

Я использовал лямбду в этом примере, но на практике вы можете определить вызываемую функцию, если у вас есть несколько связанных требований, так как эта лямбда должна сделать два вызова findParent('strong', 'sans'), чтобы избежать возникновения исключения, если <a> тег не имеет strong родителя. Используя правильную функцию, вы можете сделать тест более эффективным.

0 голосов
/ 01 апреля 2009
>>> 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>]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...