尝试使用BeautifulSoup解析HTML,但它不起作用?

时间:2011-03-03 22:55:35

标签: python beautifulsoup

我必须解析这个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 个答案:

答案 0 :(得分:2)

当您搜索text时,您正在查找与您的正则表达式匹配的所有NavigableString个对象(正在寻找任何字符后跟3,{{1如果您希望将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(name,attrs,recursive,text,limit,** kwargs)

答案 1 :(得分:0)

对于这个特殊问题,正则表达式可能已经足够好了。 我知道RegEx match open tags except XHTML self-contained tags(第一个答案是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"']

答案 2 :(得分:0)

Pyparsing的makeHTMLTags表达式将为您提供类似于正则表达式的结果,但具有自动结果名称(如命名组),以及许多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")]