蟒蛇正则表达式查找图片路径
我有类似下面的变量:蟒蛇正则表达式查找图片路径
var = '<img src="path_1"><p>Words</p><img src="path_2>'
它是一个字符串,但里面显然是HTML元素。我如何才能使用正则表达式获得第一条路径(即path_1)?
我想是这样的:
match = re.match(r'src=\"[\w-]+\"', var)
print match.group(0)
我得到这个错误:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'group'
任何帮助表示赞赏。
你should use an HTML parser像BeautifulSoup
:
>>> from bs4 import BeautifulSoup
>>> var = '<img src="path_1"><p>Words</p><img src="path_2>'
>>> soup = BeautifulSoup(var, "html.parser")
>>> soup.img["src"]
'path_1'
至于正则表达式的方法,你需要做以下修改,使其工作:
- 开关
re.search()
,re.match()
开始从匹配字符串开头 - 加一个capturing group来捕获
src
值 - 就没有必要逃避双引号
修正版本:
>>> re.search(r'src="([\w-]+)"', var).group(1)
'path_1'
我会说:你***应该***使用一个HTML解析器 –
@PedroLobito绝对,做了修改并引用了着名的线程。谢谢。 – alecxe
哇,我其实不知道这个存在。这看起来非常合适。非常感谢! –
正如评论所说,使用search()
因为match()
将尝试正则表达式从一开始匹配字符串。您也可以使用捕捉命名组,使代码更易读:
var = '<img src="path_1"><p>Words</p><img src="path_2>'
import re
match = re.search(r'src=\"(?P<path1>[\w-]+)\"', var)
if match:
print(match.group('path1'))
输出:
path_1
尝试,
path1= re.search(r'<img\s+src="(.*?)"><p>',var).group(1) # path_1
BeutifulSoup
方便。但非常慢。HTMLParser
要快得多。但使用它是痛苦的。re
是最快选项,在我看来,对于无国籍 usecases这是值得的。
如果目标文字状态,即大量的嵌套并捕获语义是很重要的,而不是实现状态机e.g解析器使用一个可用的解析器。我强烈建议lxml解析HTML和XML。这比bs4
方便一点,但在速度上相当于re
。
声明“BeautifulSoup”“很慢”的说法太过强烈。您可以将其配置为使用不同的分析器:说'lxml':'BeautifulSoup(data,“lxml”)'。或者你可以通过'SoupStrainer'等解析文档的一部分。 – alecxe
我知道它。即使你在引擎盖下使用'lxml',它比're'慢了一个数量级。所有的对象创作和外观.. –
尝试're.search()' – thebjorn
'match'只能从开头找到.. ['如果字符串开头的零个或多个字符匹配正则表达式模式](https://docs.python.org /2/library/re.html#re.match) – rock321987