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

Posted

技术标签:

【中文标题】在 Perl 中解析 HTML 和 CSS 都有哪些好方法?【英文标题】:What are some good ways to parse HTML and CSS in Perl?在 Perl 中解析 HTML 和 CSS 有哪些好方法? 【发布时间】:2011-06-29 08:56:12 【问题描述】:

我有一个项目,其中我的输入文件曾经是 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 上找到我想要的东西,并在两个月后意识到还有另一个模块对我想做的事情更好。

想法?

【问题讨论】:

由于我没有时间为你写一个真正的答案,我只会评论一个我不久前做过的事情的链接,它应该可以满足你的所有需求,但你必须自己深入研究一下:Move your CSS from stylesheets to inline with Perl. 【参考方案1】:

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

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

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

如果您需要更通用(和邪恶)的东西,您可以使用Text::Balanced(它有一些不错的标签方法,但不确定标签属性)甚至Regexp::Grammars 之类的东西来“编写”自己的东西,但这又意味着在某种程度上重新发明***,如果上述方法不能满足您的需要,我只会选择这些路线。

也许我没有帮助。也许我刚刚为您进行了文献检索,但也许其中一个比其他更适合您。

编辑:为您再添加一个解析器,似乎它可以满足您的需求HTML::Tree。然后查看HTML::Element 中的look_down 之类的方法对树进行操作。我看到了一个例子here。

【讨论】:

谢谢!将检查所有这些。【参考方案2】:

不清楚 - Perl 解析是为了转换为 HTML(带有嵌入式 CSS)吗?如果是这样,为什么不忘记 Perl 并使用旨在转换 XML 文档的 XSLT?

【讨论】:

不,我没有对 HTML 进行任何转换。我的项目接受输入文件并用它们做一些事情(没关系)。我的输入文件曾经是 XML,我很容易解析和处理。它们现在已切换到问题中定义的表单的 HTML,因此我必须更改解析它们的方式。我在问如何做这件事的好方法。

以上是关于在 Perl 中解析 HTML 和 CSS 都有哪些好方法?的主要内容,如果未能解决你的问题,请参考以下文章

主流的CSS 预处理器都有哪些?

perl 中的 HTML 解析

css复合选择器都有哪些

如何编写一个桌面应用程序,它使用 HTML 和 CSS 作为用户界面,使用 python/perl/c++/java 进行处理?

CSS的基本选择器有哪几种?分别适合在啥情况下使用?

Jquery常用的选择器都有哪些