gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 09:43:45 25 4
gpt4 key购买 nike

我正在尝试制作 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 的最小程序,松散地,没有验证,并且很容易被 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 ;这意味着“除非被告知,否则不要打印”。

您可以在没有脚本文件的情况下完成此操作,但如果您使用脚本文件,则不必担心。如果你小心的话,你甚至可以把它全部挤在一条线上。请注意 ;h之后对于 BSD 是必需的 sed无害但对 GNU 不重要 sed .

修改

有各种各样的方法可以使它更接近防弹(但它们是否值得值得商榷)。例如:

/ *<div class="item_title">\(.*\)<\/div>/

可以修改为:

/^[[:space:]]*<div class="item_title">[[:space:]]*\(.*\)[[:space:]]*<\/div>[[:space:]]*$/

处理 <div> 之前、中间和之后的任意空白序列成分。对其他正则表达式重复广告恶心。您可以安排在单词之间留一个空格。您可以安排将多行描述作为单行打印一次,而不是像现在这样将每个线段单独打印。

您还可以将整个结构包装在文件中:

/^<div class="result">$/,/^<\/div>$/ {
…script as before…
}

您可以重复这个想法,以便仅在 <div class="item"> 中选取项目标题和 </div>

关于bash - 使用 AWK/Grep/Bash 从 HTML 中提取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23746812/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com