Эквивалент селектора contains () в BeautifulSoup / Python - PullRequest
1 голос
/ 20 декабря 2011

С помощью селекторов jQuery вы можете выбрать div, который содержит innerText "John" с $("div:contains('John')"), так что вы можете сопоставить второй <div> in:

<div>Bill</div>
<div>John</div>
<div>Joe</div>

Как мне это сделать в Python's Beautiful Soup или в другом модуле Python?

Я только что посмотрел лекцию о чистке формы PyCon 2010 , где он упоминает, что вы можете использовать CSS-селекторы в lxml. Должен ли я использовать это, или есть способ только с Супом?

Справочная информация: запрос с целью разбора очищенной веб-страницы.

Ответы [ 2 ]

3 голосов
/ 20 декабря 2011

Более краткий способ с использованием BeautifulSoup:

>>> soup('div', text='John')
[u'John']
>>> import re
>>> soup('div', text=re.compile('Jo'))
[u'John', u'Joe']

soup() эквивалентен soup.findAll().Вы можете использовать строку, регулярное выражение, произвольную функцию для выбора того, что вам нужно.

stdlib's ElementTree в вашем случае достаточно:

from xml.etree import cElementTree as etree

xml = """
    <div>Bill</div>
    <div>John</div>
    <div>Joe</div>
"""
root = etree.fromstring("<root>%s</root>" % xml)
for div in root.getiterator('div'):
    if "John" in div.text:
       print(etree.tostring(div))
2 голосов
/ 20 декабря 2011
>>> from BeautifulSoup import BeautifulSoup
>>> soup = BeautifulSoup("""
... <div>Bill</div>
... <div>John</div>
... <div>Joe</div>
... """)
# equality
>>> [tag for tag in soup.findAll('div') if tag.text == 'John']
[<div>John</div>]
# containment
>>> [tag for tag in soup.findAll('div') if 'John' in tag.text]
[<div>John</div>]
...