尝试使用BeautifulSoup解析HTML,但不成功?
我需要解析这个HTML:
<a href="rtsp://v8.cache2.c.youtube.com/CjgLENy73wIaLwnqnxbpjjoGIRMYESARFEIJbXYtZ29v2Z2xlSARSB3Jlc3VsdHNgpq6joefRgbhNDA==/0/0/0/video.3gp"><img src="http://i.ytimg.com/vi/IQY6jukWn-o/default.jpg?w=80&h=60&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 个回答
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&h=60&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")]
对于这个特定的问题,正则表达式可能就足够用了。我知道有一个关于正则表达式匹配开放标签,除了XHTML自包含标签的讨论(里面的第一个答案非常棒),但这个问题看起来像是需要一个快速的解决方案来做一些完全不同的事情。
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"']
当你搜索 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"))
查看: http://www.crummy.com/software/BeautifulSoup/documentation.html#The 基本的查找方法:findAll(name, attrs, recursive, text, limit, **kwargs)