使用DOM解析器删除重复的HTML属性

时间:2018-03-10 11:55:29

标签: php html html-parsing

我有多个垃圾HTML源,我想以编程方式修复。它们是HTML文件,具有附加到元素的相同类型的多个属性,这在HTML中显然是不对的。此类标签的示例:

$$ElmLodlv

我要对此标记做的是只留下第一个非空<img alt=" " alt="Turtle" src="turtle.png" alt alt="Funny Turtle" alt=""> 属性(仅限空格),如下所示:

alt

如果只有空或仅空白属性,则属性可以消失。

我正在考虑为此任务使用正则表达式,但它似乎太容易出错。避免从标记内部删除看起来像属性的文本并非易事。

更好的解决方案是DOM解析器,但我所看到的只是忽略重复的属性,使属性数组关联,所以在这种情况下例如:

<img alt="Turtle" src="turtle.png">

如果只有解析器可以获得所有属性,例如:

[
    'alt' => ' ',
    'src' => 'turtle.png',
]

修复它会非常容易。我只是去找重复项,然后在节点上设置为第一个值。

是否有任何DOM解析器获取所有属性,包括重复项?

1 个答案:

答案 0 :(得分:0)

不知道php的合适解析器,但作为替代解决方案,您可以使用python HTMLParser。

from HTMLParser import HTMLParser

class MyHTMLParser(HTMLParser):
    def handle_starttag(self, tag, attrs):
        if tag=='img':
            print "tag:", tag, "attrs:",attrs

parser = MyHTMLParser()
parser.feed('<html><body><h1><img alt=" " alt="Turtle" src="turtle.png" alt alt="Funny Turtle" alt="">Parse me!</h1></body></html>')

# output:
# tag: img attrs: [('alt', ' '), ('alt', 'Turtle'), ('src', 'turtle.png'), ('alt', None), ('alt', 'Funny Turtle'), ('alt', '')]