使用python正则表达式查找图像路径

时间:2016-04-26 15:01:54

标签: python regex

我有一个类似下面的变量:

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 个答案:

答案 0 :(得分:5)

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(r'src="([\w-]+)"', var).group(1)
'path_1'

答案 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

答案 2 :(得分:1)

尝试,

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

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

  3. re最快的选项,在我看来,对于无状态用户来说,它是值得的。

  4. 如果目标文本是有状态的,那么很多嵌套和捕获语义很重要,而不是实现状态机,例如解析器使用可用的解析器。我强烈建议使用 lxml 来解析HTML和XML。它比bs4稍微方便,但速度与re相当。