
[英]Extract data from invalid JSON using bash, sed, grep or awk?
[英]Using AWK/Grep/Bash to extract data from HTML
我正在尝试制作一个Bash脚本以从HTML页面提取结果。 我通过Curl获得了页面的内容,但是下一步是解析输出,这是有问题的。
该页面的有趣内容如下所示:
<div class="result">
...
<div class="item">
<div class="item_title">ITEM 1</div>
</div>
...
<div class="item_desc">
ITEM DESCRIPTION 1
</div>
...
</div>
<div class="result">
...
<div class="item">
<div class="item_title">ITEM 2</div>
</div>
...
<div class="item_desc">
ITEM DESCRIPTION 2
</div>
...
</div>
我想输出类似:
ITEM1;ITEM DESCRIPTION 1
ITEM2;ITEM DESCRIPTION 2
我对Grep有所了解,但是我无法决定要使其在这里工作,还是有人告诉我使用Awk,它似乎最适合这种任务。
我将不胜感激。
非常感谢你。
一个可以处理HTML的最简单的程序是:
/ *<div class="item_title">\(.*\)<\/div>/ { s//\1/; h; }
/ *<div class="item_desc">/,/<\/div>/ {
/<div class="item_desc">/d
/<\/div>/d
s/^ *//
G
s/\(.*\)\n\(.*\)/\2;\1/p
}
第一行与项目标题行匹配。 s///
命令仅捕获<div …>
和</div>
之间的部分; h
复制到保留空间(内存)中。
脚本的其余部分匹配项目描述<div>
及其</div>
。 前两行删除(忽略) <div>
和</div>
行。 s///
删除前导空格; G
在换行符之后将保留空间附加到模式空间; s///p
捕获换行符之前的部分(描述)和换行符之后的部分(保留空间中的标题),然后将其替换为标题和描述,并用分号分隔,并打印结果。
$ sed -n -f sed.script items.html
ITEM 1;ITEM DESCRIPTION 1
ITEM 2;ITEM DESCRIPTION 2
$
注意-n
; 这意味着“除非被告知,否则请勿打印”。
您可以在不使用脚本文件的情况下完成此操作,但是使用脚本文件无需担心。 如果您小心的话,甚至可以将所有内容压缩到一行上。 当心;
对于BSD sed
, h
是必需的且无害,但对于GNU sed
则不重要。
有各种各样的方法可以使它更接近防弹(但是否值得一事尚有争议)。 例如:
/ *<div class="item_title">\(.*\)<\/div>/
可以修改为:
/^[[:space:]]*<div class="item_title">[[:space:]]*\(.*\)[[:space:]]*<\/div>[[:space:]]*$/
处理<div>
组件之前,之中和之后的任意空白序列。 对其他正则表达式重复ad nauseam。 您可以安排单词之间有单个空格。 您可以安排多行描述仅作为单行打印一次,而不是像现在这样单独打印每个线段。
您还可以将整个构造包装在文件中:
/^<div class="result">$/,/^<\/div>$/ {
…script as before…
}
您可以重复该想法,以便仅在<div class="item">
和</div>
等内部选择项目标题。
只需使用awk:
awk -F '<[^>]+>' '
found { sub(/^[[:space:]]*/,";"); print title $0; found=0 }
/<div class="item_title">/ { title=$2 }
/<div class="item_desc">/ { found=1 }
' file
ITEM 1;ITEM DESCRIPTION 1
ITEM 2;ITEM DESCRIPTION 2
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.