我正在尝试从 HTML 输出中获取数据,如下所示:
<strong>Target1NoSpaces</strong><span class="creator"> ....
<strong>Target2 With Spaces</strong><span class="creator"> ....
我正在使用管道系统将数据缩减到我想要达到的目标。到目前为止,这是我的方法:
grep "/strong" output.html | awk '{print $1}'
Grep“/strong”以获取包含目标的行;效果很好。
通过管道连接到“awk '{print $1}”。当目标没有空格时,这在情况#1 中有效,但在目标有空格时的情况#2 中失败。仅保留第一个单词,如下所示:
<strong>Target1NoSpaces</strong><span
<strong>Target2
无论是在我的 awk 中还是在不同的命令中,您对正确命中目标有什么建议吗?任何快速而肮脏的东西(grep、awk、sed、perl)将不胜感激。
更新: 我很欣赏使用适当的 HTML 解析器或工具进行抓取的建议。然而,在我正在研究这个问题时,运行脚本的进程不需要做更多的事情,只需从使用
curl
检索到的网页中提取行即可。
pup
,一个用于处理 HTML 的命令行工具。例如:
$ pup 'strong text{}' < file.html
Target1NoSpaces
Target2 With Spaces
xpup
。
html-xml-utils
。
使用
mojolicious
及其 DOM
解析器的一种方法:
perl -Mojo -E '
g("http://your.web")
->dom
->find("strong")
->each( sub { if ( $t = shift->text ) { say $t } } )'
在 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
这是使用 xmlstarlet
的解决方案xml sel -t -v //strong input.html
尝试在没有真正的 HTML 解析器的情况下解析 HTML 是一个坏主意。话虽如此,对于您提供的具体示例,这是一个非常快速且肮脏的解决方案。当存在多个时,它将不起作用 <strong>
标记在一行上,当标记超过一行时,等等
awk -F '<strong>|</strong>' '/<strong>/ {print $2}' filename
grep
和
awk
并且字段分隔符不必是空格:
$ awk -F'<|>' '/strong/{print $3}' file
Target1NoSpaces
Target2 With Spaces
但是,您确实应该为此使用合适的解析器。
perl -ne 'if(/(?:<strong>)(.*)(?:<\/strong>)/){print $1."\n";}' input.html
curl -Ss https://stackoverflow.com/questions/18746957/parsing-html-on-the-command-line-how-to-capture-text-in-strong-strong |
hxnormalize -x |
hxselect -s '\n' strong
输出:
<strong class="fc-black-750 mb6">Stack Overflow
for Teams</strong>
<strong>Teams</strong>
仅捕获内容:
curl -Ss https://stackoverflow.com/questions/18746957/parsing-html-on-the-command-line-how-to-capture-text-in-strong-strong |
hxnormalize -x |
hxselect -s '\n' -c strong
Stack Overflow
for Teams
Teams