2016-04-26 73 views
1

我有类似下面的变量:蟒蛇正则表达式查找图片路径

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' 

任何帮助表示赞赏。

+3

尝试're.search()' – thebjorn

+0

'match'只能从开头找到.. ['如果字符串开头的零个或多个字符匹配正则表达式模式](https://docs.python.org /2/library/re.html#re.match) – rock321987

回答

4

should use an HTML parserBeautifulSoup

>>> 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' 
+2

我会说:你***应该***使用一个HTML解析器 –

+1

@PedroLobito绝对,做了修改并引用了着名的线程。谢谢。 – alecxe

+1

哇,我其实不知道这个存在。这看起来非常合适。非常感谢! –

2

正如评论所说,使用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 
1

尝试,

path1= re.search(r'<img\s+src="(.*?)"><p>',var).group(1) # path_1 
  1. BeutifulSoup方便。但非常慢

  2. HTMLParser要快得多。但使用它是痛苦的。

  3. re最快选项,在我看来,对于无国籍 usecases这是值得的。

如果目标文字状态,即大量的嵌套并捕获语义是很重要的,而不是实现状态机e.g解析器使用一个可用的解析器。我强烈建议lxml解析HTML和XML。这比bs4方便一点,但在速度上相当于re

+0

声明“BeautifulSoup”“很慢”的说法太过强烈。您可以将其配置为使用不同的分析器:说'lxml':'BeautifulSoup(data,“lxml”)'。或者你可以通过'SoupStrainer'等解析文档的一部分。 – alecxe

+0

我知道它。即使你在引擎盖下使用'lxml',它比're'慢了一个数量级。所有的对象创作和外观.. –