Shell-Script

如何使用 grep 和 cut in 腳本從 HTML 文件中獲取網站 URL

  • June 10, 2020

我正在嘗試使用 grep 和 cut 從 HTML 文件中提取 URL。連結如下所示:

<a href="http://examplewebsite.com/">

其他網站有.net.gov但我想我可以在此之前做出分界點>。所以我知道我可以使用 grep 和 cut 以某種方式切斷 http 之前和 .com 之後的所有內容,但我已經堅持了一段時間。

正如我在評論中所說,使用正則表達式解析 HTML 通常不是一個好主意,但如果您正在解析的 HTML 表現良好,您有時可以僥倖逃脫。

為了只獲取元素href屬性中的URL <a>,我發現在多個階段中最容易做到這一點。從您的評論來看,您似乎只想要頂級域,而不是完整的 URL。在這種情況下,您可以使用以下內容:

grep -Eoi '<a [^>]+>' source.html |
grep -Eo 'href="[^\"]+"' | 
grep -Eo '(http|https)://[^/"]+'

source.html包含要解析的 HTML 程式碼的文件在哪裡。

此程式碼將列印作為每行中任何元素的href屬性出現的所有頂級 URL 。<a>第一個命令的-i選項grep是確保它對<a><A>元素都有效。我想你也可以給-i第二個grep來擷取大寫HREF屬性,OTOH,我寧願忽略這種破碎的 HTML。:)

處理內容http://google.com/

wget -qO- http://google.com/ |
grep -Eoi '<a [^>]+>' | 
grep -Eo 'href="[^\"]+"' | 
grep -Eo '(http|https)://[^/"]+'

輸出

http://www.google.com.au
http://maps.google.com.au
https://play.google.com
http://www.youtube.com
http://news.google.com.au
https://mail.google.com
https://drive.google.com
http://www.google.com.au
http://www.google.com.au
https://accounts.google.com
http://www.google.com.au
https://www.google.com
https://plus.google.com
http://www.google.com.au

當我被重定向到澳大利亞 Google 頁面時,我的輸出與其他範例略有不同。

不確定您是否受限於工具:

但是正則表達式可能不是如上所述的最佳方式,但這是我放在一起的一個例子:

cat urls.html | grep -Eo "(http|https)://[a-zA-Z0-9./?=_%:-]*" | sort -u
  • grep -E: 和 egrep 一樣
  • grep -o: 只輸出已經被 grepped 的內容
  • (http|https): 是一個/或
  • a-z: 都是小寫
  • A-Z: 都是大寫
  • .: 是點
  • /: 是斜線
  • ?: 是 ?
  • =: 是等號
  • _: 是下劃線
  • %: 是百分號
  • :: 是冒號
  • -: 是破折號
  • *: 是重複$$ … $$團體
  • sort -u:將排序並刪除任何重複項

輸出:

bob@bob-NE722:~s$  wget -qO- https://stackoverflow.com/ | grep -Eo "(http|https)://[a-zA-Z0-9./?=_-]*" | sort -u
https://stackauth.com
https://meta.stackoverflow.com
https://cdn.sstatic.net/Img/svg-icons
https://stackoverflow.com
https://www.stackoverflowbusiness.com/talent
https://www.stackoverflowbusiness.com/advertising
https://stackoverflow.com/users/login?ssrc=head
https://stackoverflow.com/users/signup?ssrc=head
https://stackoverflow.com
https://stackoverflow.com/help
https://chat.stackoverflow.com
https://meta.stackoverflow.com
...

您還可以添加\d以擷取其他數字類型。

引用自:https://unix.stackexchange.com/questions/181254