在Perl中解析HTML和CSS有哪些好方法?

时间:2011-02-17 20:07:49

标签: html css perl

我有一个项目,我的输入文件曾经是XML。我现在被要求开始使用嵌入式CSS开始处理HTML,并且我希望尽可能简单地完成此操作并尽可能少地进行代码更改。我使用XML :: LibXML来解析XML文件,但现在我们正在转向使用CSS的HTML,我想我需要转向其他东西。也就是说,在我深深陷入愚蠢的决定之前,我可能会后悔,我想在这里问:你们有什么用于这种任务的?

旧XML和新HTML输入文件的结构非常相似,两者都保存相同的信息。 HTML使用div代替XML的文本节点,并将样式信息保存在样式标记和属性中,而不是分隔的xml属性。

旧XML的一个例子是:

<text font="TimesNewRoman,BoldItalic" size="11.04" x="59" y="405" w="52"
      h="12" bold="yes" italic="yes" cs="4.6" o_bbox="59,405;52,12"
      o_size="11.04" o_cs="4.6">
Some text
</text>

新HTML的一个例子是:

<div o="9ka" style="position:absolute;top:145;left:89;x-pdf-top:744;x-pdf-left:60;x-pdf-bottom:732;x-pdf-right:536;">
  <span class="ft19" >
    Some text
  </span></nobr>
</div>

其中“ft19”指的是格式页面顶部的css样式元素:

.ft19{ vertical-align:top;font-size:14px;x-pdf-font-size:14px;
       font-family:Times;color:#000000;x-pdf-color:#000000;font-style:italic;
       x-pdf-letter-spacing:0.83px;}

基本上,我想要的只是一个解析器,可以将每个节点的样式元素作为属性读取,所以我可以这样做:

my @texts_arr = $page_node->findnodes('text');
my $test_node = $texts_arr[1];
print "node\'s bold value is: " . $text_node->getAttribute('bold');

因为我可以使用XML。是否有类似的解析HTML?我真的很想确保以正确的方式开始,而不是在CPAN上找到我想要的东西,并在两个月后意识到还有另一个模块对我正在尝试做的事情更好。

想法?

2 个答案:

答案 0 :(得分:3)

我所知道的基本是HTML::Parser

还有一个与它一起工作的项目,Marpa::HTML这是更大的解析器项目Marpa的工作,它解析可以在BNF documented on the author's blog中描述的任何语言。是非常有趣但更新和实验。

我也看到非常成功的WWW :: Mechanize使用HTML::TokeParser,它使用HTML::PullParser,所以也是如此。

如果你需要更通用(和邪恶)的东西,你可以使用类似Text::Balanced(它有一些很好的标签方法,但不确定标签属性)甚至{ {3}},但这又意味着重新发明轮子,如果上述情况不符合你的需要,我只会选择这些路线。

也许我没有帮助。也许我刚刚为你做过文献搜索,但也许其中一个对你来说比其他人更好。

编辑:为您提供一个解析器,似乎它可以做您需要的Regexp::Grammars。然后查看来自HTML::Treelook_down等方法来对树进行操作。我看到了一个例子HTML::Element

答案 1 :(得分:0)

目前尚不清楚 - 是否为了转换为HTML(使用嵌入式CSS)而进行Perl解析?如果是这样,为什么不忘记Perl并使用旨在转换XML文档的XSLT?