Python正则表达式提取html标记的src内容?

2024-04-25 21:50:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我试过这样的方法,但失败了。我不知道regex有人能帮我吗

import re

html = """
<body>
<h1>dummy heading</h1>
<img src="/pic/earth.jpg" alt="planet" width="200">
<img src="/pic/redrose.jpg" alt="flower" width="200">
</body>
"""
x = re.search('^src=".*jpg$', html)
print(x)

我希望输出如下['/pic/earth.jpg','/pic/redrose.jpg']


Tags: 方法importresrcimghtmlbodyalt
2条回答

第一步很好,但是您的代码有几个小问题:

  • ^$指字符串的开头和结尾
    • 或启用re.MULTILINE标志的行尾
  • .search()返回NullMatch对象,而不是匹配的字符串
  • 您可能需要.findall()方法
  • 如果您的正则表达式中有反斜杠(您还没有),那么您可能希望对正则表达式代码使用原始r"string"字符串
  • 还要考虑输入数据中可能存在的所有可能的排列,例如HTML允许'"引用,并且在非图像的某些内容中可能存在src=属性

以下是文件: -https://docs.python.org/3/library/re.html#re.findall

将此作为正则表达式进行尝试:

image_urls = re.findall(r'<img[^<>]+src=["\']([^"\'<>]+\.(?:gif|png|jpe?g))["\']', html, re.I)
print(image_urls)
>>> ['/pic/earth.jpg', '/pic/redrose.jpg']

要稍微分解一下这一点:

  • re.findall()返回字符串列表
  • <img我们希望从图像标记开始
  • [^<>]+1个或多个不打开/关闭html标记的字符
    • 当前<img>中可能没有src=""标记
  • ["\']HTML可以使用任何一种类型的引号
  • [^"\'<>]+在字符串和标记未关闭时,继续读取1+个字符
  • \.文字点需要转义,否则它们表示“匹配任何内容”特殊字符
  • (?:gif|png|jpe?g)一系列可能的文件扩展名,但不要为它们创建捕获括号(这将在数组中返回这些扩展名)
  • ([^"\'<>]+\.(?:gif|png|jpe?g))这是每个匹配实际返回的内容的捕获括号
  • ["\']搜索结束引号以结束捕获括号
  • re.I使正则表达式不区分大小写

我不擅长正则表达式。所以我的答案可能不是最好的

试试这个

x = re.findall(r'(?=src)src=\"(?P<src>[^\"]+)', html)

你可以看到下面的x

['/pic/earth.jpg', '/pic/redrose.jpg']

正则表达式解释:

(?=src):正向查找>;只看那些有srcword的

src=\”:必须包含此特定单词src=“

(?p somthing):此表达式将somthing分组为namesrc

[^\“]+:除“字符”之外的所有内容

相关问题 更多 >