【问题标题】:Remove duplicated HTML attributes with DOM parser使用 DOM 解析器删除重复的 HTML 属性
【发布时间】:2018-08-18 21:52:20
【问题描述】:

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

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

我想用这个标签做的是只留下第一个非空的alt属性(只有空格被认为是空的),像这样:

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

如果只有空属性或纯空格属性,则该属性可以消失。

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

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

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

如果只有解析器可以获取所有属性,像这样:

[
    ['name' => 'alt', 'value' => ' '],
    ['name' => 'alt', 'value' => 'Turtle'],
    ['name' => 'src', 'value' => 'turtle.png'],
    ['name' => 'alt', 'value' => null],
    ['name' => 'alt', 'value' => 'Funny Turtle'],
    ['name' => 'alt', 'value' => ''],
]

修复它会很容易。我只是去查找重复项,然后将节点上的属性设置为第一个值。

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

【问题讨论】:

    标签: php html html-parsing


    【解决方案1】:

    不知道适合 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', '')]
    

    【讨论】:

    • 哦,这很有趣!所以 Python 的 HTML 解析器就是这样做的。它是否支持类似 CSS 的选择器?
    • 不,它只是解析输入并为 starttag、数据、评论等调用用户定义的处理程序......所以仍然需要做很多工作才能达到您想要的结果。跨度>
    猜你喜欢
    • 2011-10-11
    • 1970-01-01
    • 2011-05-18
    • 2012-02-26
    • 2020-07-16
    • 2013-01-14
    • 1970-01-01
    • 2020-04-02
    • 2017-01-12
    相关资源
    最近更新 更多