Пытаетесь разобрать HTML с помощью BeautifulSoup, но это не работает? - PullRequest
0 голосов
/ 04 марта 2011

Я должен разобрать этот HTML:

<a href="rtsp://v8.cache2.c.youtube.com/CjgLENy73wIaLwnqnxbpjjoGIRMYESARFEIJbXYtZ29vZ2xlSARSB3Jlc3VsdHNgpq6joefRgbhNDA==/0/0/0/video.3gp"><img src="http://i.ytimg.com/vi/IQY6jukWn-o/default.jpg?w=80&amp;h=60&amp;sigh=izeIwhz4POtPOOr-jRGrtC4qiFA" alt="video" width="80" height="60" style="border:0;margin:0px;" /></a>

Я ищу все ссылки, заканчивающиеся на .3gp.

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

Пробовал:

comment = soup.find(text=re.compile(".3gp")) 

Ответы [ 3 ]

2 голосов
/ 04 марта 2011

Когда вы ищете text, вы ищете все NavigableString объекты, которые соответствуют вашему регулярному выражению (который ищет любой символ, за которым следуют 3, gи b - используйте \.3agb, если хотите сопоставить .3agb буквально с регулярным выражением).

Используйте soup.findAll и найдите любые теги <a> с href, которые соответствуютчто вы хотите следующим образом:

soup.findAll('a', attrs={'href': re.compile(".3gp")})
#or
soup.findAll('a', href=re.compile(".3gp"))

SEE: http://www.crummy.com/software/BeautifulSoup/documentation.html#The базовый метод поиска: findAll (имя, атрибуты, рекурсивный, текст, лимит, ** kwargs)

0 голосов
/ 04 марта 2011

Выражение makeHTMLTags в Pyparsing даст вам результаты, аналогичные регулярному выражению, но с автоматическими именами результатов (например, именованными группами) и допуском многих особенностей HTML:

>>> from pyparsing import *
>>>
>>> h = """<a href="rtsp://v8.cache2.c.youtube.com/CjgLENy73wIaLwnqnxbpjjoGIRMYE
SARFEIJbXYtZ29vZ2xlSARSB3Jlc3VsdHNgpq6joefRgbhNDA==/0/0/0/video.3gp"><img src="h
ttp://i.ytimg.com/vi/IQY6jukWn-o/default.jpg?w=80&amp;h=60&amp;sigh=izeIwhz4POtP
OOr-jRGrtC4qiFA" alt="video" width="80" height="60" style="border:0;margin:0px;"
 /></a>"""
>>>
>>> aTag = makeHTMLTags("A")[0]
>>> result = aTag.parseString(h)
>>> print result.dump()
['A', ['href', 'rtsp://v8.cache2.c.youtube.com/CjgLENy73wIaLwnqnxbpjjoGIRMYESARFEIJbXYtZ29vZ2xlSARSB3Jlc3VsdHNgpq6joefRgbhNDA==/0/0/0/video.3gp'], False]
- empty: False
- href: rtsp://v8.cache2.c.youtube.com/CjgLENy73wIaLwnqnxbpjjoGIRMYESARFEIJbXYtZ29vZ2xlSARSB3Jlc3VsdHNgpq6joefRgbhNDA==/0/0/0/video.3gp
- startA: ['A', ['href', 'rtsp://v8.cache2.c.youtube.com/CjgLENy73wIaLwnqnxbpjjoGIRMYESARFEIJbXYtZ29vZ2xlSARSB3Jlc3VsdHNgpq6joefRgbhNDA==/0/0/0/video.3gp'], False]
  - empty: False
  - href: rtsp://v8.cache2.c.youtube.com/CjgLENy73wIaLwnqnxbpjjoGIRMYESARFEIJbXYtZ29vZ2xlSARSB3Jlc3VsdHNgpq6joefRgbhNDA==/0/0/0/video.3gp
>>> print result.href
rtsp://v8.cache2.c.youtube.com/CjgLENy73wIaLwnqnxbpjjoGIRMYESARFEIJbXYtZ29vZ2xlSARSB3Jlc3VsdHNgpq6joefRgbhNDA==/0/0/0/video.3gp

Если у вас много якорных тегов и вы хотите, чтобы они заканчивались на «.3gp», выполните:

>>> _3gp_links = [a.href for a in aTag.searchString(h) if a.href.endswith(".3gp")]
0 голосов
/ 04 марта 2011

Для этой конкретной проблемы регулярные выражения, вероятно, достаточно хороши. Я знаю, что RegEx соответствует открытым тэгам, за исключением автономных тэгов XHTML (первый ответ - awsumness), но эта проблема кажется быстрым взломом, чтобы сделать что-то совершенно другое

In [1]: import re

In [2]: a = """...THE TEXT YOU PASTED.."""

In [3]: re.findall('".*?3gp"', a)
Out[3]: ['"rtsp://v8.cache2.c.youtube.com/CjgLENy73wIaLwnqnxbpjjoGIRMYESARFEIJbXYtZ29vZ2xlSARSB3Jlc3VsdHNgpq6joefRgbhNDA==/0/0/0/video.3gp"']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...