如何使用HTML :: Parser解析格式错误的HTML

时间:2014-04-16 06:12:29

标签: perl html-parsing

我正在尝试使用meta-tag解析HTML:

<meta name="id" content=""12345.this.is.a.sample:id:required.67890"@abc.com">

html :: parser返回此“”空值而不是所需的实际值。这是我的代码,描述了启动事件处理程序:

sub start { 
    my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
    if ($tagname eq 'meta') {
        print "Meta found: ", $attr->{ name }, $attr->{content}, "\n";

    } 
}

有关如何获得所需价值的任何想法?

2 个答案:

答案 0 :(得分:0)

我认为来自Charles Babbage的引用适用于此:

  

有两次我被问到 - “请告诉巴贝奇先生,如果你把错误的数字输入机器,那么正确的答案会出来吗?”[...]我无法正确理解这种混淆可能引发这样一个问题的想法。

     

- 哲学家生活的段落(1864)

这被称为Garbage-In, Garbage-Out (GIGO)原则。在您的情况下,您的HTML格式不正确。如果将其提供给HTML解析器,则必然会出现虚假输出。 HTML标准已经非常宽松,无法处理各种常见错误,但你的例子更加破碎。

当然,有一种解决方案:不要将您的输入视为HTML,而是将某些衍生格式视为合法输入。您必须编写自己的自定义解析器或根据需要调整现有的HTML解析器,但这样可行。

但是,我认为修复输入源比编写自己的解析器更容易。所需要的只是要转义的属性中的引号,或者属性使用单引号:

<meta name="id" content="&quot;12345.this.is.a.sample:id:required.67890&quot;@abc.com">
<meta name="id" content='"12345.this.is.a.sample:id:required.67890"@abc.com'>

答案 1 :(得分:0)

好的,找到了获取此特定问题内容的方法。上面的 $ origtext 变量获取 argspec标识符 文本的值,该值在文档中定义为:

Text causes the source text (including markup element delimiters) to be passed.

所以,基本上,

print $origtext;

会给我输出源文本:

<meta name="id" content=""12345.this.is.a.sample:id:required.67890"@abc.com">

我可以使用正则表达式来利用$origtext中包含的这个值并获得所需的东西。