我有一个类似下面的变量:
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'
感谢任何帮助。
答案 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()
,re.match()
从字符串的开头src
值修正版:
>>> 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
BeutifulSoup
很方便。但非常慢。
HTMLParser
要快得多。但使用它很痛苦。
re
是最快的选项,在我看来,对于无状态用户来说,它是值得的。
如果目标文本是有状态的,那么很多嵌套和捕获语义很重要,而不是实现状态机,例如解析器使用可用的解析器。我强烈建议使用 lxml 来解析HTML和XML。它比bs4
稍微方便,但速度与re
相当。