解析HTML并在<a> tag

时间:2016-04-21 11:51:42

标签: regex html-parsing

I need to parse HTML code and find all occurrences of <img> tags within an <a> tag to replace something in the <a> tag.

Let's say, I want to find

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

The <a> tag can contain different attributes and what I need to replace is:

<a by <a class="something"

The parsing is done in Python but I think, I will need the use of regular expressions.
However, I am pretty new to regular expressions so I am wondering how I can do this.

2 个答案:

答案 0 :(得分:0)

假设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的内容。

答案 1 :(得分:0)

声明

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

描述

这个正则表达式将:

  • 找到包裹IMG标签的所有Anchor标签
  • 将与开头"<a "匹配,因此可以将其替换为<a class=somevalue
  • 避免一些非常困难的边缘案例

(<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>