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

问题描述 投票:0回答:8

我正在尝试从 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
检索到的网页中提取行即可。

perl sed awk grep command-line-interface
8个回答
14
投票

尝试

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

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

要通过 XPath 搜索,请尝试

xpup

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

html-xml-utils


7
投票

使用

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

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

6
投票

在 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

4
投票

这是使用 xmlstarlet

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

3
投票

尝试在没有真正的 HTML 解析器的情况下解析 HTML 是一个坏主意。话虽如此,对于您提供的具体示例,这是一个非常快速且肮脏的解决方案。当存在多个时,它将不起作用 <strong>

 标记在一行上,当标记超过一行时,等等

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

3
投票
您永远不需要

grep

awk
 并且字段分隔符不必是空格:

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

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


2
投票
自从你标记了 perl

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

0
投票
我很惊讶没有人提到 W3C

HTML-XML-utils

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

    
© www.soinside.com 2019 - 2024. All rights reserved.