Красивый суп - захват строки после первого указанного тега - PullRequest
0 голосов
/ 06 января 2012

Я пытаюсь получить строку сразу после открывающего тега <td>.Следующий код работает:

webpage = urlopen(i).read()
soup = BeautifulSoup(webpage)
for elem in soup('td', text=re.compile(".\.doc")):
    print elem.parent

, когда HTML выглядит так:

<td>plan_49913.doc</td>

, но не когда HTML выглядит так:

<td>plan_49913.doc<br /> <font color="#990000">Document superseded by: &#160;</font><a href="/plans/Jan_2012.html">January 2012</a></td>

Я пытался играть с attrs, но не могу заставить его работать.По сути, я просто хочу захватить «plan_49913.doc» в любом экземпляре HTML.

Любой совет будет принята с благодарностью.

Заранее спасибо.

~ chrisK

Ответы [ 2 ]

1 голос
/ 06 января 2012

Это работает для меня:

>>> html = '<td>plan_49913.doc<br /> <font color="#990000">Document superseded by: &#160;</font><a href="/plans/Jan_2012.html">January 2012</a></td>'
>>> soup = BeautifulSoup(html)
>>> soup.find(text=re.compile('.\.doc'))
u'plan_49913.doc

Есть ли что-то, чего мне не хватает?

Также обратите внимание, что согласно документации:

ЕслиВы используете текст, тогда любые значения, которые вы задаете для имени и аргументов ключевого слова, игнорируются.

Поэтому вам не нужно передавать 'td', так как он уже игнорируется, то есть любой текст, которыйсовпадения под любым другим тегом будут возвращены.

0 голосов
/ 06 января 2012

Просто используйте свойство next, оно содержит следующий узел, и это текстовый узел.

>>> html = '<td>plan_49913.doc<br /> <font color="#990000">Document superseded by: &#160;</font><a href="/plans/Jan_2012.html">January 2012</a></td>'
>>> bs = BeautifulSoup(html)
>>> texts = [ node.next for node in bs.findAll('td') if node.next.endswith('.doc') ]
>>> texts
[u'plan_49913.doc']

вы можете изменить предложение if на регулярное выражение, если хотите.

...