整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          如何使用htmlq提取html文件內容

          tmlq能夠對 HTML 數據進行 sed 或 grep 操作。我們可以使用 htmlq 搜索、切片和過濾 HTML 數據。讓我們看看如何在 Linux 或 Unix 上安裝和使用這個方便的工具并處理 HTML 數據。

          什么是htmlq?

          htmlq類似于 jq,但用于 HTML。使用 CSS 選擇器從 HTML 文件中提取部分內容。在 CSS 中,選擇器用于定位我們想要設置樣式的網頁上的 HTML 元素。例如,我們可以使用此工具輕松提取圖像或其他 URL。

          安裝htmlq

          首先需要在系統中安裝cargo然后使用cargo來安裝htmlq:

          [root@localhost ~]# yum -y install cargo
          [root@localhost ~]# cargo install htmlq
          

          設置可執行的路徑

          確保將 $HOME/.cargo/bin 添加到 PATH 變量中,以便能夠使用 export 命令運行已安裝的二進制文件:

          [root@localhost ~]# echo 'export PATH="$PATH:$HOME/.cargo/bin"' >> ~/.bash_profile 
          [root@localhost ~]# . ~/.bash_profile 
          

          如何使用 htmlq 從 HTML 文件中提取內容?

          下面是使用curl和htmlq的用法:

          curl -s url | htmlq '#css-selector'
          curl -s url2 | htmlq '.css-selector'
          curl -s https://www.linuxprobe.com | htmlq --pretty '#content' | more
          

          讓我們找到頁面中的所有鏈接。例如:

          [root@localhost ~]# curl -s https://www.linuxprobe.com | htmlq --attribute href a
          


          人性化顯示HTML:

          [root@localhost ~]# curl --silent https://mgdm.net | htmlq --pretty '#posts'
          

          幫助手冊

          使用下面命令查看幫助頁面:

          [root@localhost ~]# htmlq --help
          htmlq 0.3.0
          Michael Maclean <michael@mgdm.net>
          Runs CSS selectors on HTML
          
          USAGE:
              htmlq [FLAGS] [OPTIONS] [selector]...
          
          FLAGS:
              -B, --detect-base          Try to detect the base URL from the <base> tag in the document. If not found, default to
                                         the value of --base, if supplied
              -h, --help                 Prints help information
              -w, --ignore-whitespace    When printing text nodes, ignore those that consist entirely of whitespace
              -p, --pretty               Pretty-print the serialised output
              -t, --text                 Output only the contents of text nodes inside selected elements
              -V, --version              Prints version information
          
          OPTIONS:
              -a, --attribute <attribute>    Only return this attribute (if present) from selected elements
              -b, --base <base>              Use this URL as the base for links
              -f, --filename <FILE>          The input file. Defaults to stdin
              -o, --output <FILE>            The output file. Defaults to stdout
          
          ARGS:
              <selector>...    The CSS expression to select [default: html]
          

          總結

          htmlq能夠對 HTML 數據進行 sed 或 grep 操作。我們可以使用 htmlq 搜索、切片和過濾 HTML 數據。

          否還在使用正則表達式處理文本呢?其實AI可以幫助你更輕松地完成任務。今天我將與大家分享如何使用claude Al從HTML中提取數據。首先,我們需要進行兩個階段的處理:第一步是采集原始數據,即下拉列表中的選項。第二步是使用AI處理數據。

          首先,我們需要選擇下拉列表中的元素,也就是options。但是,由于該下拉列表是由JS控制的,如果我們點擊其他地方,它會縮回去。因此,如果我們再次點擊“檢查元素”,它就會縮回去。

          為了解決這個問題,我們需要觀察該下拉列表的動態行為。我們可以發現,它位于這一行中。此時,我們可以使用一個小技巧,右鍵復制元素,將其復制到剪貼板中。我們可以看到,剛才的options內容已經被復制到剪貼板中。現在,我們可以查看剛才的輸出。這是原始數據采集的過程。

          采集到數據后,我們需要登錄claude Al,然后將其粘貼到文本中,它將自動轉換為一個TXT文件。然后,我們可以輸入“help me actrac info from the following text”的指令,它將自動執行一段Python代碼,幫助我們處理數據。

          它將自動生成一段代碼,讓我們自己處理數據。此時,我們可以告訴它“can you print the output for me”。我們只需要告訴它需要在哪個標簽中提取數據即可。此時,它將執行其中的代碼,并輸出所需的數據。輸出結果將顯示為“我”。

          此外,我們還可以使用其他數據來執行其他操作,這非常簡單。

          當然,這只是一個示例。您可能需要處理的不是HTML、XML或其他結構化或半結構化文本。在這種情況下,您可以直接將這些任務交給AI,讓AI幫助您完成這些任務,從而使您更加輕松。因此,這是一個非常簡單的技巧,希望您能學會。

          要使用sed、awk、grep等工具進行嘗試(這會導致不可預期的結果)。在許多情況下,你最好選擇使用支持XML數據的編程語言進行處理。如果必須使用shell腳本,有一些專門用于解析HTML和XML文件的工具可供使用。

          Lynx

          你可能知道Lynx是一個帶有極限限制的終端模式Web瀏覽器。確實如此,但它也是一個可編程的HTML解析器。它特別擅長從文檔中提取鏈接并將其打印出來:

          如果你想要包括圖像鏈接,請添加-image_links選項?,F在,根據你的需求過濾鏈接應該相對簡單,因為每個鏈接都在單獨的一行上,沒有HTML標簽的干擾。

          $ lynx -dump -listonly -nonumbers http://mywiki.wooledge.org/
          http://mywiki.wooledge.org/EnglishFrontPage?action=rss_rc&unique=1&ddiffs=1
          http://mywiki.wooledge.org/EnglishFrontPage?action=edit
          http://mywiki.wooledge.org/EnglishFrontPage
          http://mywiki.wooledge.org/EnglishFrontPage?action=raw
          http://mywiki.wooledge.org/EnglishFrontPage?action=print
          http://mywiki.wooledge.org/EnglishFrontPage?action=AttachFile&do=view&target=Greg's-wiki.zip
          [...]
          

          你可能會認為wget在這方面也很好用,對吧?我的意思是,它有遞歸鏡像模式,所以顯然內部做了這種操作。祝你好運,試圖找到一種方法讓wget將URL打印出來而不是下載全部文件。

          我試著嘗試了一下,找到了一種方法。沒有經過充分測試。我們可以使用--rejected-log和始終匹配的--reject-regex參數。我們使用--spider選項以不保存文件的方式執行。

          $ wget -q --spider -r --rejected-log=rejected --reject-regex=^ http://mywiki.wooledge.org/
          $ cat rejected
          REASON  U_URL   U_SCHEME        U_HOST  U_PORT  U_PATH  U_PARAMS        U_QUERY U_FRAGMENT      P_URL   P_SCHEME        P_HOST  P_PORT  P_PATH  P_PARAMS        P_QUERY P_FRAGMENT
          REGEX   http%3A//mywiki.wooledge.org/moin_static198/common/js/common.js SCHEME_HTTP     mywiki.wooledge.org     80      moin_static198/common/js/common.js      http%3A//mywiki.wooledge.org/   SCHEME_HTTP     mywiki.wooledge.org     80                          
          REGEX   http%3A//mywiki.wooledge.org/moin_static198/modernized/css/common.css   SCHEME_HTTP     mywiki.wooledge.org     80      moin_static198/modernized/css/common.css                                http%3A//mywiki.wooledge.org/   SCHEME_HTTP     mywiki.wooledge.org     80                          
          REGEX   http%3A//mywiki.wooledge.org/moin_static198/modernized/css/screen.css   SCHEME_HTTP     mywiki.wooledge.org     80      moin_static198/modernized/css/screen.css                                http%3A//mywiki.wooledge.org/   SCHEME_HTTP     mywiki.wooledge.org     80                          
          REGEX   http%3A//mywiki.wooledge.org/moin_static198/modernized/css/print.css    SCHEME_HTTP     mywiki.wooledge.org     80      moin_static198/modernized/css/print.css                         http%3A//mywiki.wooledge.org/   SCHEME_HTTP     mywiki.wooledge.org     80                          
          REGEX   http%3A//mywiki.wooledge.org/moin_static198/modernized/css/projection.css       SCHEME_HTTP     mywiki.wooledge.org     80      moin_static198/modernized/css/projection.css                            http%3A//mywiki.wooledge.org/   SCHEME_HTTP     mywiki.wooledge.org     80                          
          [...]
          

          要將鏈接提取到標準輸出中:

          $ wget -q --spider -r --rejected-log=/dev/stdout --reject-regex=^ http://mywiki.wooledge.org/ | tail -n +2 | cut -f 2
          http%3A//mywiki.wooledge.org/moin_static198/common/js/common.js
          http%3A//mywiki.wooledge.org/moin_static198/modernized/css/common.css
          http%3A//mywiki.wooledge.org/moin_static198/modernized/css/screen.css
          http%3A//mywiki.wooledge.org/moin_static198/modernized/css/print.css
          http%3A//mywiki.wooledge.org/moin_static198/modernized/css/projection.css
          [...]
          

          xmllint

          xmllint是處理大多數XML的最佳選擇。不幸的是,使用它需要學習XPath,而我并不知道任何合理的XPath入門教程。以下是一些簡單的技巧。它們是使用以下輸入文件演示的:

          <staff>
          <person name="bob"><salary>70000</salary></person>
          <person name="sue"><salary>90000</salary></person>
          </staff>
          

          請注意,xmllint在輸出中不添加換行符。如果你用CommandSubstitution進行捕獲,這不是問題。但如果你在交互式shell中測試,這將很快變得很煩人。你可以考慮編寫一個包裝函數,例如:

          xmllint() { command xmllint "$@"; echo; }
          

          簡單技巧:

          1. 打印第一個salary標簽:
          $ xmllint --xpath 'string(//salary)' foo.xml
          70000
          
          1. 打印所有的salary標簽(請注意,以這種形式打印并不特別有用):
          $ xmllint --xpath '//salary/text()' foo.xml
          7000090000
          
          1. 計算person標簽的數量:
          $ xmllint --xpath 'count(//person)' foo.xml
          2
          
          1. 分別打印每個人的salary:
          $ xmllint --xpath '//person[1]/salary/text()' foo.xml
          70000
          $ xmllint --xpath '//person[2]/salary/text()' foo.xml
          90000
          
          1. 打印bob的salary:
          $ xmllint --xpath '//person[@name="bob"]/salary/text()' foo.xml 
          70000
          
          1. 打印第二個人的name:
          $ xmllint --xpath 'string(//person[2]/@name)' foo.xml
          sue
          

          Namespaces

          上述示例顯示,當你擁有一個不錯的XML解析器時,解析XML是相當容易的,但這違背了XML的目的,即讓每個人都感到痛苦。因此,一些聰明人引入了XML命名空間。

          一個典型的maven構建文件(稱為pom.xml)就是這樣的例子,大致如下:

          <project xmlns="http://maven.apache.org/POM/4.0.0"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
                                http://maven.apache.org/xsd/maven-4.0.0.xsd">
            <modelVersion>4.0.0</modelVersion>
           
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>my-project</artifactId>
            <version>1.0-SNAPSHOT</version>
          </project>
          

          通常還會有幾百行用于依賴項,但我們來保持簡潔。

          根據前一章的示例,我們知道從該文件中提取版本只需使用xpath /project/version/text():

          $ xmllint --xpath '/project/version/text()' pom.xml
          XPath set is empty
          

          嗯,不是這樣的,因為作者聰明地為這個xmlns="http://maven.apache.org/POM/4.0.0"添加了一個默認命名空間,所以現在你首先必須指定確切的URL,然后才能指明要獲取的版本元素內部的文本。

          xmllint --shell

          xmllint的--xpath選項沒有辦法指定命名空間,所以它現在無法使用(除非你編輯文件并刪除命名空間聲明)。但其shell功能確實允許設置命名空間。

          xmllint --shell pom.xml << EOF
          setns ns=http://maven.apache.org/POM/4.0.0
          cat /ns:project/ns:version/text()
          EOF
          / > / >  -------
          1.0-SNAPSHOT
          / >
          

          耶!我們得到了版本號...外加一些來自xmllint shell的提示和廢話,之后必須將其刪除。

          xmlstarlet

          xmlstarlet對于這個任務來說稍微容易一些

          $ xmlstarlet sel -N ns=http://maven.apache.org/POM/4.0.0 -t -v /ns:project/ns:version -n pom.xml
          1.0-SNAPSHOT
          

          python

          Python也附帶了一個XML解析器,通常比xmllint和xmlstarlet更常用。它也可以以一種笨拙的方式處理命名空間。

          $ python -c 'import xml.etree.ElementTree as ET;print(ET.parse("pom.xml").find("{http://maven.apache.org/POM/4.0.0}version").text)'
          1.0-SNAPSHOT
          

          xsltproc

          xsltproc恰好在大多數Linux系統上安裝。例如提取播客的標題和URL:

          xslt() {
          cat << 'EOX'
          <?xml version="1.0"?>
          <x:stylesheet version="1.0" xmlns:x="http://www.w3.org/1999/XSL/Transform">
          <x:output method="text" />
          <x:template match="/">
          <x:for-each select="//item">
                  <x:text># </x:text>
                  <x:value-of select="./title/text()" /><x:text>
          <!-- newline --></x:text>
                  <x:value-of select="enclosure/@url" /><x:text>
          </x:text>
          </x:for-each>
          </x:template>
          </x:stylesheet>
          EOX
          }
          
          curl -s http://podcasts.files.bbci.co.uk/p02nq0lx.rss | xsltproc <(xslt) -
          



          如果你想學習如何編寫更加健壯和可靠的 Shell 腳本,減少生產環境中的錯誤和故障,那么關注我吧!我會分享 Shell 編程的最佳實踐和建議,幫助你提高 Shell 腳本的魯棒性和可維護性。如果你想深入了解 Shell 編程的實際應用和技巧,可以關注我的《Shell 腳本編程最佳實踐》專欄,里面有我在一線互聯網大廠的實際生產經驗和最佳實踐,幫助你高效完成各種自動化任務。


          主站蜘蛛池模板: 亚洲一区综合在线播放| 久久精品一区二区三区不卡| 熟妇人妻一区二区三区四区| 丝袜人妻一区二区三区网站 | 在线视频一区二区三区四区| 精品视频在线观看你懂的一区| 无码日韩人妻AV一区免费l| 在线播放偷拍一区精品| 国产精品视频一区二区三区经| 亚洲一区二区三区四区视频| 亚洲另类无码一区二区三区| 国产精品一区二区电影| 视频精品一区二区三区| 国产亚洲欧洲Aⅴ综合一区| 中文字幕精品亚洲无线码一区 | 国产香蕉一区二区三区在线视频 | 国产在线无码视频一区| 亚洲字幕AV一区二区三区四区| 美女AV一区二区三区| 99精品国产一区二区三区不卡| 国产精品女同一区二区久久| 中文字幕av日韩精品一区二区 | 日韩在线一区高清在线| 久久无码一区二区三区少妇| 精品国产一区二区三区免费看 | 国产一区二区精品久久凹凸| 色欲综合一区二区三区| 亚洲无圣光一区二区| 精品久久久久久无码中文字幕一区| 亚洲爆乳精品无码一区二区三区| 国产主播福利精品一区二区| 一区二区三区视频在线| 久热国产精品视频一区二区三区| 精品成人一区二区三区免费视频| 久久久久女教师免费一区| 精品国产一区二区三区在线 | 国产精品香蕉在线一区| 国产精品视频一区二区三区四| 久久精品道一区二区三区| 一区二区三区四区视频| 精品深夜AV无码一区二区|