【问题标题】:Extract contents of paragraph tag using a Perl one liner使用 Perl one liner 提取段落标签的内容
【发布时间】:2011-02-17 20:19:16
【问题描述】:

我想使用 perl reg ex one liner 来匹配段落标签的内容。段落是这样的:

<p style="font-family: Calibri,Helvetica,serif;">Text I want to extract</p>

所以我一直在使用这样的东西:

perl -nle 'm/<p>($.)<\/p>/ig; print $1' file.html

任何想法表示赞赏

谢谢

【问题讨论】:

  • 为什么是正则表达式?这通常不太适合 HTML 解析。 perl -MHTML::TreeBuilder -e'print HTML::TreeBuilder-&gt;new_from_file("filename.html")-&gt;find("p")-&gt;as_text'
  • @David:我在程序中经常使用 HTML::TreeBuilder,但我承认我从来没有想过在单行中使用它!
  • 这非常有效...知道如何传递 *.html 而不是 filename.html 吗?我想从目录中的文件中获取所有段落。
  • 打印地图 {HTML::TreeBuilder->new_from_file($_)->find("p")->as_text} grep {/.*\.html} File::Util->list_dir ('/一些/目录');还是类似的?

标签: html perl tags expression


【解决方案1】:

强制link 当您尝试使用正则表达式解析 HTML 时会发生什么。

David Dorward 的评论,使用HTML::TreeBuilder,是一个很好的评论。 另一个好方法是使用HTML::DOM

perl -MHTML::DOM -e 'my $dom = HTML::DOM->new(); $dom->parse_file("file.html"); my @p = $dom->getElementsByTagName("p"); print $p[0]->innerText();'

【讨论】:

  • 强制链接 herehere 显示当 I - 但可能不是 you ☺ - 尝试使用正则表达式解析 HTML 时会发生什么。 Here’s one more explaining 仅仅因为你可以并不意味着你应该。
【解决方案2】:

$ 在匹配部分表示“字符串结尾”,您还需要以 p-tag 非贪婪方式匹配所有内容:

perl -nle 'm/&lt;p.*?&gt;(.+)&lt;\/p/ig; print $1' test.html

【讨论】:

  • 这或多或少起到了作用,尽管 cmets 关于用正则表达式解析 HTML 的无效性也是有效的。我必须使用正则表达式,因为我没有尝试执行此操作的框的 root 密码,因此无法安装任何好的 HTML::TreeBuilder 库。
  • @John,你不需要 root 来安装模块。 stackoverflow.com/questions/540640/…
  • @tadmc,谢谢你,不幸的是,我在本地安装 perl 模块从来没有成功过。
猜你喜欢
  • 1970-01-01
  • 2012-08-01
  • 2017-04-02
  • 2016-11-22
  • 2014-03-19
  • 2012-09-01
  • 2014-07-31
  • 1970-01-01
  • 2013-09-02
相关资源
最近更新 更多