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

时间:2013-09-11 16:49:54

标签: perl sed awk grep command-line-interface

我正在尝试从HTML输出中获取如下所示的数据:

<strong>Target1NoSpaces</strong><span class="creator"> ....
<strong>Target2 With Spaces</strong><span class="creator"> ....

我正在使用管道列车将数据减少到我想要击中的目标。到目前为止,这是我的方法:

grep "/strong" output.html | awk '{print $1}'

grep on“/ strong”获取目标线;这很好。

管道'awk'{print $ 1}'。当目标没有空格时,它适用于#1;但当目标有空格时,#2的情况则失败。只有第一个单词保留如下:

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

你有没有关于正确击中目标的提示,无论是在我的awk还是在不同的命令中?任何快速和肮脏的东西(grep,awk,sed,perl)都会受到赞赏。

7 个答案:

答案 0 :(得分:5)

使用mojolicious及其DOM解析器的一种方法:

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

答案 1 :(得分:4)

在grep中使用Perl正则表达式的后视和前瞻功能。它应该比使用awk更简单。

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

输出:

Target1NoSpaces
Target2 With Spaces

添加:

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

ruby -e 'File.read(ARGV.shift).scan(/(?<=<strong>).*?(?=<\/strong>)/m).each{|e| puts "----------"; puts e;}' file

输入:

<strong>Target
A
B
C
</strong><strong>Target D</strong><strong>Target E</strong>

输出:

----------
Target
A
B
C
----------
Target D
----------
Target E

答案 2 :(得分:2)

Trying to parse HTML without a real HTML parser is a bad idea.话虽如此,对于您提供的具体示例,这是一个非常快速和肮脏的解决方案。当有多个<strong>标记时,它将无效在一行上,当标签运行多行时等等。

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

答案 3 :(得分:2)

您永远不需要grep awk,而字段分隔符不一定是空格:

$ awk -F'<|>'  '/strong/{print $3}' file
Target1NoSpaces
Target2 With Spaces

然而,您应该使用适当的解析器。

答案 4 :(得分:2)

以下是使用xmlstarlet

的解决方案
xml sel -t -v //strong input.html

答案 5 :(得分:2)

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

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

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

或者,对于格式良好的HTML / XML文档,请尝试html-xml-utils

答案 6 :(得分:1)

因为你标记了perl

perl -ne 'if(/(?:<strong>)(.*)(?:<\/strong>)/){print $1."\n";}' input.html