[英]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.