我有一个项目,我的输入文件曾经是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>
Run Code Online (Sandbox Code Playgroud)
新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>
Run Code Online (Sandbox Code Playgroud)
其中"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;}
Run Code Online (Sandbox Code Playgroud)
基本上,我想要的只是一个解析器,它可以将每个节点的样式元素作为属性读取,所以我可以这样做:
my @texts_arr = $page_node->findnodes('text');
my $test_node = $texts_arr[1];
print "node\'s bold value is: " . $text_node->getAttribute('bold');
Run Code Online (Sandbox Code Playgroud)
因为我可以使用XML.是否有类似的解析HTML?我真的很想确保以正确的方式开始,而不是在CPAN上找到我想要的东西,并在两个月后意识到还有另一个模块对我正在尝试做的更好.
想法?
我所知道的基本一点是HTML::Parser。
还有一个与它一起工作的项目,Marpa::HTML这是更大的解析器项目的工作Marpa,它解析可以用 BNF 描述的任何语言,记录在作者的博客上,非常有趣,但更新且更具实验性。
我还看到非常成功的 WWW::Mechanize 使用HTML::TokeParser,并且它也使用HTML::PullParser,所以这也是。
如果您需要更通用(和邪恶)的东西,您可以考虑使用类似的东西“编写”自己的东西Text::Balanced(它有一些很好的标签方法,但不确定标签属性)甚至Regexp::Grammars,但这又意味着在某种程度上重新发明轮子,如果上述路线不能满足您的需要,我只会选择这些路线。
也许是我没帮上忙。也许我刚刚为你做了文献检索,但也许其中一个比其他的更适合你。
编辑:为您提供另一个解析器,似乎它可以满足您的需要HTML::Tree。然后查看类似look_downfrom 的方法HTML::Element来作用于树。我在这里看到了一个例子。