簡體   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