解析HTML并在标记内查找img标记

问题描述:

我需要解析HTML代码并在<a>标记内找到所有出现的<img>标记,以替换<a>标记中的某些内容。解析HTML并在<a>标记内查找img标记

比方说,我想找到

<a ...><img src="path/to/image" /></a> 

<a>标签可以包含不同的属性,我需要更换的是:

<a通过<a class="something"

解析是在Python完成但我认为,我需要使用正则表达式。
不过,我对正则表达式很新,所以我想知道如何做到这一点。

+1

使用BeautifulSoup或任何其他parser..Don't解析'HTML'用正则表达式 – rock321987

+0

关于解析HTML与正则表达式:http://*.com/a/1732454/1771634 –

+0

非常感谢。这看起来非常好,易于使用和快速... – user3515612

假设HTML是不靠谱(当有似乎是内<script> s个标签是复杂的事情),这是很容易。

你可以用这个正则表达式得到了<a...>属性列表:

<a([^>]+)><img[^>]+></a>

(如果你觉得有可能是事物之间的空间,你可以使用<a([^>]+)>\s*<img[^>]+>\s*</a>。)

这是真的如果你只需要添加一件事就容易了。您可以使用:

re.sub(r'<a([^>]+)><img([^>]+)></a>', 
     r'<a' + ' class="something" ' + r'\1><img\2></a>', 
     string) 

在上面的例子中,我使用第二个捕获组获得img的内容。

免责声明

你真的应该使用HTML parsing engine因为有许多模糊的边缘情况下,该正则表达式不能轻松容纳。但我不会告诉你如何过你的生活。

说明

此正则表达式将:

  • 找到所有的锚标签,围绕IMG标签包装
  • 将匹配,因此它可以与<a class=somevalue
  • 替代开幕"<a "避免一些真的困难的边缘情况

(<a\b\s*)(?=(?:[^>=]|='[^']*'|="[^"]*"|=[^'"][^\s>]*)*?\s?\/?>\s*<img\b\s*(?:[^>=]|='[^']*'|="[^"]*"|=[^'"][^\s>]*)*?\s?\/?>\s*<\/a>)

Regular expression visualization

示例文本

注意困难边缘情况下,在属性的onmouseover。

<a onmouseover=' href="NotTheDroidYoureLookingFor" ; funRotator("<img href="not_the_droid_you_are_looking_for.png>") ; ' href="http://NotTheDroid.html">No droids here. </a> <a onmouseover=' href="Jedi_Mind_Trick.html" ; funRotator("<img href="not_the_droid_you_are_looking_for.png>") ; ' href="http://FoundTheDroid.html/"><img src="path/to/image/Desired_Droid.png" /> </a>

的Python

在Python中,你可以你的示例文本分配到一个名为original_string变量,并发出以下行。请注意单引号已经加倍,因为整个正则表达式字符串被封装在一个单引号中。

new_string = re.sub(r'(<a\b\s*)(?=(?:[^>=]|=''[^'']*''|="[^"]*"|=[^''"][^\s>]*)*?\s?\/?>\s*<img\b\s*(?:[^>=]|=''[^'']*''|="[^"]*"|=[^'"][^\s>]*)*?\s?\/?>\s*<\/a>)', r'<a class=FoundDroids ', original_string)

结果

后的搜索和替换:

<a onmouseover=' href="NotTheDroidYoureLookingFor" ; funRotator("<img href="not_the_droid_you_are_looking_for.png>") ; ' href="http://NotTheDroid.html">No droids here. </a> <a class=FoundDroids onmouseover=' href="Jedi_Mind_Trick.html" ; funRotator("<img href="not_the_droid_you_are_looking_for.png>") ; ' href="http://FoundTheDroid.html/"><img src="path/to/image/Desired_Droid.png" /> </a>