解析HTML并在标记内查找img标记
我需要解析HTML代码并在<a>
标记内找到所有出现的<img>
标记,以替换<a>
标记中的某些内容。解析HTML并在<a>标记内查找img标记
比方说,我想找到
<a ...><img src="path/to/image" /></a>
的<a>
标签可以包含不同的属性,我需要更换的是:
<a
通过<a class="something"
解析是在Python完成但我认为,我需要使用正则表达式。
不过,我对正则表达式很新,所以我想知道如何做到这一点。
假设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>)
示例文本
注意困难边缘情况下,在属性的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>
使用BeautifulSoup或任何其他parser..Don't解析'HTML'用正则表达式 – rock321987
关于解析HTML与正则表达式:http://*.com/a/1732454/1771634 –
非常感谢。这看起来非常好,易于使用和快速... – user3515612