繁体   English   中英

使用AWK / Grep / Bash从HTML提取数据

[英]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的最简单的程序是:

sed.script

/ *<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 sedh是必需的且无害,但对于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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM