【问题标题】:Parse HTML and find img tags within an <a> tag解析 HTML 并在 <a> 标签中找到 img 标签
【发布时间】:2016-08-14 14:31:09
【问题描述】:

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

比方说,我想找到

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

&lt;a&gt; 标签可以包含不同的属性,我需要替换的是:

&lt;a&lt;a class="something"

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

【问题讨论】:

  • 使用 BeautifulSoup 或任何其他解析器。不要使用正则表达式解析 HTML
  • 关于用Regex解析HTML:*.com/a/1732454/1771634
  • 非常感谢。这看起来非常好,易于使用且速度快......

标签: regex html-parsing


【解决方案1】:

假设 HTML 并不复杂(当&lt;script&gt;s 中似乎有标签时,它会使事情变得复杂),这很容易。

您可以使用此正则表达式从&lt;a...&gt; 获取属性列表:

&lt;a([^&gt;]+)&gt;&lt;img[^&gt;]+&gt;&lt;/a&gt;

(如果发现事物之间可能有空格,可以使用&lt;a([^&gt;]+)&gt;\s*&lt;img[^&gt;]+&gt;\s*&lt;/a&gt;。)

如果您只需要添加一件事,这真的很容易。您可以使用:

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

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

【讨论】:

    【解决方案2】:

    免责声明

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

    说明

    这个正则表达式将:

    • 找到所有环绕 IMG 标签的 Anchor 标签
    • 将匹配开头"&lt;a ",因此可以替换为&lt;a class=somevalue
    • 避免一些非常困难的边缘情况

    (&lt;a\b\s*)(?=(?:[^&gt;=]|='[^']*'|="[^"]*"|=[^'"][^\s&gt;]*)*?\s?\/?&gt;\s*&lt;img\b\s*(?:[^&gt;=]|='[^']*'|="[^"]*"|=[^'"][^\s&gt;]*)*?\s?\/?&gt;\s*&lt;\/a&gt;)

    示例

    示例文本

    注意 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'(&lt;a\b\s*)(?=(?:[^&gt;=]|=''[^'']*''|="[^"]*"|=[^''"][^\s&gt;]*)*?\s?\/?&gt;\s*&lt;img\b\s*(?:[^&gt;=]|=''[^'']*''|="[^"]*"|=[^'"][^\s&gt;]*)*?\s?\/?&gt;\s*&lt;\/a&gt;)', r'&lt;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>

    【讨论】: