Perl 在命令行上解析HTML;如何在<;中捕获文本;strong></强>;?

Perl 在命令行上解析HTML;如何在<;中捕获文本;strong></强>;?,perl,sed,awk,grep,command-line-interface,Perl,Sed,Awk,Grep,Command Line Interface,我试图从HTML输出中获取如下数据: <strong>Target1NoSpaces</strong><span class="creator"> .... <strong>Target2 With Spaces</strong><span class="creator"> .... Grep on“/strong”以获取与目标的连线;那很好 管道到'awk'{print$1}'。当目标没有空格时,在第#1种情况下有效,但

我试图从HTML输出中获取如下数据:

<strong>Target1NoSpaces</strong><span class="creator"> ....
<strong>Target2 With Spaces</strong><span class="creator"> ....
Grep on“/strong”以获取与目标的连线;那很好

管道到'awk'{print$1}'。当目标没有空格时,在第#1种情况下有效,但当目标有空格时,在第#2种情况下无效。仅保留第一个单词,如下所示:

<strong>Target1NoSpaces</strong><span
<strong>Target2

Target1NoSpaces在grep中使用Perl regex的向后看和向前看功能。它应该比使用awk更简单

grep -oP "(?<=<strong>).*?(?=</strong>)" file
加:

在Ruby中实现Perl的正则表达式的多重匹配可以在多行中匹配值:

ruby -e 'File.read(ARGV.shift).scan(/(?<=<strong>).*?(?=<\/strong>)/m).each{|e| puts "----------"; puts e;}' file
话虽如此,对于您提供的具体示例,这里有一个非常快速而肮脏的解决方案。当一行上有多个
标记时,当标记运行在多行上时,此功能将不起作用

awk -F '<strong>|</strong>' '/<strong>/ {print $2}' filename
awk-F'|'//{print$2}文件名

您永远不需要
grep
awk
一起使用,并且字段分隔符不必是空白:

$ awk -F'<|>'  '/strong/{print $3}' file
Target1NoSpaces
Target2 With Spaces
$awk-F''/strong/{print$3}文件
Target1NoSpaces
带空格的Target2

但是,您确实应该为此使用适当的解析器

单向使用
mojolicious
及其
DOM
解析器:

perl -Mojo -E '
    g("http://your.web")
    ->dom
    ->find("strong")
    ->each( sub { if ( $t = shift->text ) { say $t } } )'
因为您标记了perl

perl -ne 'if(/(?:<strong>)(.*)(?:<\/strong>)/){print $1."\n";}' input.html
perl-ne'if(/(?:)(.*)(?:)/{print$1.\n”;}input.html
下面是一个使用

Try,一个用于处理HTML的命令行工具。例如:

$ pup 'strong text{}' < file.html 
Target1NoSpaces
Target2 With Spaces
$pup'强文本{}

要通过XPath进行搜索,请尝试


或者,对于格式良好的HTML/XML文档,请尝试。

您尝试的是“屏幕抓取”。我想你迟早会需要比“文本之间的‘强’”更一般的东西。既然您在标记中添加了“Perl”,我鼓励您查看。否则,请查看此处:。它可以匹配其中包含
strong
的任何文本。或者,如果没有找到字段,只需要换行。@konsolebox如果我们进入用
awk
解析html的陷阱,我们可能会在这里呆一会儿。我只是想在我的观点中演示它的用法,OP可以根据需要过滤/使其更健壮,或者采纳我的建议并使用适当的html解析器。+1如果标记没有拆分为多行,那么这是一个很好的方法。这非常有效。标签位于单行上,是单词或两个/三个单词的集合。输出是规则的,并且总是相同的,所以做更多事情的方法是多余的。我喜欢awk和perl实现,并将把它们收起来供将来使用。谢谢,所有这些都提升了我的知识@sudo_O Perl regex的多行特性实际上可以用于此目的。我在Ruby中添加了它的概念实现。迈克尔J:欢迎:)谢谢你的提示!我仍然遵循这一思路,以便在简单CLI解析方面保持最新。感谢您的回答,直到关于
pup
!:D
$ awk -F'<|>'  '/strong/{print $3}' file
Target1NoSpaces
Target2 With Spaces
perl -Mojo -E '
    g("http://your.web")
    ->dom
    ->find("strong")
    ->each( sub { if ( $t = shift->text ) { say $t } } )'
perl -ne 'if(/(?:<strong>)(.*)(?:<\/strong>)/){print $1."\n";}' input.html
xml sel -t -v //strong input.html
$ pup 'strong text{}' < file.html 
Target1NoSpaces
Target2 With Spaces