我正在尝试从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)都会受到赞赏。
答案 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