整合營銷服務商

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

          免費咨詢熱線:

          Python小案例77-解析HTML文檔

          解析HTML文檔,可以使用一些編程語言中的HTML解析庫或工具。以下是一些常用的方法:

          1. 使用Python中的BeautifulSoup庫:BeautifulSoup是一個功能強大的HTML解析庫,可以幫助你從HTML文檔中提取數據。你可以使用pip安裝BeautifulSoup,然后使用它的解析器來解析HTML文檔。
          from bs4 import BeautifulSoup
          
          # 讀取HTML文檔
          with open('example.html', 'r') as file:
              html = file.read()
          
          # 創建BeautifulSoup對象
          soup = BeautifulSoup(html, 'html.parser')
          
          # 使用BeautifulSoup對象提取數據
          # 例如,提取所有的鏈接
          links = soup.find_all('a')
          for link in links:
              print(link.get('href'))
          
          1. 使用JavaScript中的DOM解析器:如果你在瀏覽器環境中,可以使用JavaScript的DOM解析器來解析HTML文檔。你可以使用document對象來訪問和操作HTML元素。
          // 讀取HTML文檔
          var html = document.documentElement.innerHTML;
          
          // 使用DOM解析器提取數據
          // 例如,提取所有的鏈接
          var links = document.getElementsByTagName('a');
          for (var i = 0; i < links.length; i++) {
              console.log(links[i].getAttribute('href'));
          }
          
          1. 使用其他編程語言的HTML解析庫:除了Python和JavaScript,還有許多其他編程語言也有自己的HTML解析庫,例如Java中的Jsoup、Ruby中的Nokogiri等。你可以根據自己的編程語言選擇適合的HTML解析庫來解析HTML文檔。

          無論你選擇哪種方法,解析HTML文檔的關鍵是了解HTML的結構和標簽,并使用相應的解析器或工具來提取所需的數據。

          當你解析HTML文檔時,你可能會遇到以下一些常見的任務和技術:

          1. 選擇器:使用選擇器可以方便地定位和提取HTML文檔中的特定元素。例如,你可以使用CSS選擇器來選擇具有特定類名或ID的元素,或者使用XPath來選擇具有特定屬性或層次結構的元素。
          2. 提取數據:一旦你定位到了要提取的元素,你可以使用相應的方法或屬性來獲取元素的文本內容、屬性值或其他相關信息。例如,你可以使用getText()方法來獲取元素的文本內容,使用getAttribute()方法來獲取元素的屬性值。
          3. 遍歷文檔:HTML文檔通常是一個樹狀結構,你可以使用遍歷方法來訪問和操作文檔中的不同元素。例如,你可以使用遞歸或循環來遍歷文檔的子元素、父元素或兄弟元素。
          4. 處理嵌套結構:HTML文檔中的元素可能會有嵌套的結構,你需要處理這些嵌套關系來正確地提取數據。例如,你可以使用遞歸方法來處理嵌套的列表、表格或嵌套的div元素。
          5. 處理特殊情況:在解析HTML文檔時,可能會遇到一些特殊情況,例如處理動態生成的內容、處理特殊字符或處理錯誤的HTML結構。你需要根據具體情況選擇合適的方法來處理這些特殊情況。

          總的來說,解析HTML文檔需要一定的HTML知識和編程技巧。你需要了解HTML的結構和標簽,選擇合適的解析器或工具,使用選擇器來定位元素,提取所需的數據,并處理特殊情況。通過不斷練習和實踐,你將能夠更熟練地解析HTML文檔并提取所需的數據。

          tmlAgilityPack是一個.NET平臺下的HTML解析庫,它可以將HTML文本轉換為DOM文檔對象,方便我們對HTML文本進行操作和分析。HtmlAgilityPack支持XPath語法,可以通過XPath表達式來獲取DOM節點,同時還提供了一些方便的API,可以實現HTML文本的解析、修改、生成等功能。本文將詳細介紹HtmlAgilityPack的使用及使用方法。

          一、HtmlAgilityPack的安裝

          HtmlAgilityPack是一個NuGet包,可以通過Visual Studio的NuGet包管理器來安裝。具體步驟如下:

          1. 打開Visual Studio,打開要安裝HtmlAgilityPack的項目。
          2. 在“解決方案資源管理器”中右鍵單擊項目,選擇“管理NuGet程序包”。
          3. 在“NuGet程序包管理器”中搜索“HtmlAgilityPack”,選擇“安裝”。
          4. 等待安裝完成。

          安裝完成后,就可以在項目中使用HtmlAgilityPack了。

          二、HtmlAgilityPack的使用

          1. 加載HTML文本

          使用HtmlAgilityPack解析HTML文本的第一步是將HTML文本加載到一個HtmlDocument對象中。可以通過以下代碼來實現:

          HtmlDocument doc = new HtmlDocument();
          doc.LoadHtml(htmlText);

          其中,htmlText是要解析的HTML文本。LoadHtml方法會將HTML文本解析成一個DOM文檔對象,并存儲在doc對象中。

          1. 獲取DOM節點

          HtmlAgilityPack提供了一些方法來獲取DOM節點,例如GetElementById、GetElementsByTagName、SelectSingleNode、SelectNodes等。這些方法都接受一個XPath表達式作為參數,用來指定要獲取的節點。以下是一些示例代碼:

          // 獲取id為"content"的節點
          HtmlNode contentNode = doc.GetElementById("content");
          
          // 獲取所有的a標簽
          HtmlNodeCollection aNodes = doc.DocumentNode.SelectNodes("//a");
          
          // 獲取第一個p標簽
          HtmlNode pNode = doc.DocumentNode.SelectSingleNode("//p");

          其中,XPath表達式的語法與XML的XPath語法相同。在這里不再詳細介紹。

          1. 修改DOM節點

          HtmlAgilityPack提供了一些方法來修改DOM節點,例如SetAttributeValue、InnerHtml、OuterHtml等。以下是一些示例代碼:

          // 修改id為"content"的節點的class屬性
          contentNode.SetAttributeValue("class", "new-class");
          
          // 修改第一個p標簽的內容
          pNode.InnerHtml = "這是新的內容";
          
          // 修改第一個a標簽的href屬性
          HtmlNode aNode = aNodes[0];
          aNode.SetAttributeValue("href", "http://www.example.com");
          1. 生成HTML文本

          HtmlAgilityPack還可以將DOM文檔對象轉換為HTML文本。可以通過以下代碼來實現:

          string newHtmlText = doc.DocumentNode.OuterHtml;

          其中,OuterHtml屬性返回DOM文檔對象的HTML文本表示。

          三、HtmlAgilityPack的功能實例

          下面將通過一些具體的實例來演示HtmlAgilityPack的使用方法。

          1. 獲取頁面標題

          以下代碼演示了如何獲取頁面標題:

          HtmlDocument doc = new HtmlDocument();
          doc.LoadHtml(htmlText);
          
          HtmlNode titleNode = doc.DocumentNode.SelectSingleNode("//title");
          string title = titleNode.InnerHtml;

          其中,htmlText是要解析的HTML文本。首先,將HTML文本加載到一個HtmlDocument對象中。然后,通過XPath表達式“//title”獲取頁面標題節點。最后,通過InnerHtml屬性獲取標題的內容。

          1. 獲取頁面中的所有圖片

          以下代碼演示了如何獲取頁面中的所有圖片:

          HtmlDocument doc = new HtmlDocument();
          doc.LoadHtml(htmlText);
          
          HtmlNodeCollection imgNodes = doc.DocumentNode.SelectNodes("//img");
          foreach (HtmlNode imgNode in imgNodes)
          {
              string src = imgNode.GetAttributeValue("src", "");
              Console.WriteLine(src);
          }

          首先,將HTML文本加載到一個HtmlDocument對象中。然后,通過XPath表達式“//img”獲取所有圖片節點。最后,遍歷所有圖片節點,獲取每個節點的src屬性。

          1. 獲取頁面中的所有鏈接

          以下代碼演示了如何獲取頁面中的所有鏈接:

          HtmlDocument doc = new HtmlDocument();
          doc.LoadHtml(htmlText);
          
          HtmlNodeCollection aNodes = doc.DocumentNode.SelectNodes("//a");
          foreach (HtmlNode aNode in aNodes)
          {
              string href = aNode.GetAttributeValue("href", "");
              Console.WriteLine(href);
          }

          首先,將HTML文本加載到一個HtmlDocument對象中。然后,通過XPath表達式“//a”獲取所有鏈接節點。最后,遍歷所有鏈接節點,獲取每個節點的href屬性。

          1. 修改頁面中的所有鏈接

          以下代碼演示了如何將頁面中的所有鏈接修改為指定的鏈接:

          HtmlDocument doc = new HtmlDocument();
          doc.LoadHtml(htmlText);
          
          HtmlNodeCollection aNodes = doc.DocumentNode.SelectNodes("//a");
          foreach (HtmlNode aNode in aNodes)
          {
              aNode.SetAttributeValue("href", "http://www.example.com");
          }
          
          string newHtmlText = doc.DocumentNode.OuterHtml;

          首先,將HTML文本加載到一個HtmlDocument對象中。然后,通過XPath表達式“//a”獲取所有鏈接節點。最后,遍歷所有鏈接節點,將它們的href屬性修改為指定的鏈接。最后,通過OuterHtml屬性將修改后的DOM文檔對象轉換為HTML文本。

          本文介紹了HtmlAgilityPack的使用及使用方法。HtmlAgilityPack是一個功能強大、易用性高的HTML解析庫,可以方便地對HTML文本進行操作和分析。通過本文的介紹,讀者可以了解HtmlAgilityPack的基本用法,并可以根據需要自行擴展。

          我們先前進行網站頁面內容解析的過程中,通常選擇運用正則表達式來完成此任務。然而,正如前面幾篇文章所闡述和分析的那樣,無論是正則表達式還是XPath,它們雖各自具備適應不同應用場景的優勢,卻也都存在著各自難以避免的缺陷。例如,正則表達式具有相對復雜的語法結構并且需要大量的編程知識才能熟練掌握;而XPath雖然使得實現路徑查找更為簡潔易懂,但卻需要編寫復雜的節點路徑編碼。因此,為了充分利用HTML讀取技術的強大功能,同時追求更加簡明直觀的操作體驗,本文將向您推薦Beautiful Soup這款強大的三方工具。那么,它是否能夠如其名字那般“美麗”呢?接下來,讓我們共同揭開這個謎團!

          Beautiful Soup 也是一個 Python 的 XML 和 HTML 的解析庫,其提供了簡單的,Python 式的函數來處理導航,搜索,修改分析樹等功能(來自官方介紹)。

          Beautiful Soup來源于愛麗絲夢游仙境

          開始使用

          在使用 Beautiful Soup 之前,需要安裝好 lxml(推薦 lxml 解析器) 和其自身的庫。

          pip install beautifulsoup4
          pip install lxml

          beautiful Soup 在解析過程中依賴各種解析器,除了支持 Python 標準的解析器外,還支持其他的三方解析器(如: lxml)。

          各種解析器優缺點

          一般在使用的過程中,推薦使用 lxml,因為 lxml 本身也是一個非常優秀的解析庫,也支持 XML 的解析。

          假設有以下內容的 html 文檔。

          <!DOCTYPE html>
          <html lang="en">
          <body>
            <div>
              <ul>
                <li class="class-0">
                  <a href="a.html">
                    <span>第一個標簽</span>
                  </a>
                </li>
              </ul>
            </div>
          </body>
          </html>
          from bs4 import BeautifulSoup
          
          # 初始化BeautifulSoup,并指定lxml為解析器
          soup = BeautifulSoup(open("index.html"), 
                               "lxml")
          # 獲取span標簽
          print(soup.span)
          print(soup.span.string)
          
          # <span>第一個標簽</span>
          # 第一個標簽

          如上代碼,BeautifulSoup 方法有有兩個參數, 第一個參數接受一個 html 文檔,第二個參數指定解釋器類型,這樣就初始化了一個BeautifulSoup 的對象,后續就可以使用這個對象來解析和獲取 HTML 中的數據,如上方獲取 span, 并獲取 span 的內容。

          獲取 bs 對象有兩種方式,一種是直接使用文本字符,另一種是讀取文檔:

          from bs4 import BeautifulSoup
          
          soup = BeautifulSoup(open("index.html"))
          soup = BeautifulSoup("<html>data</html>")

          元素選擇

          通過上邊的代碼示例可以看到,在獲取到 bs 對象后,后續直接調用節點名稱就可以獲取到節點對象,再調用 string 屬性就可以獲取到節點的文本內容,相較于使用正則表達式或者 XPath 效率是非常高的。

          html_doc = """
          <html><head><title>The Dormouse's story</title></head>
          <body>
          <p class="title"><b>The Dormouse's story</b></p>
          
          <p class="story">Once upon a time there were three little sisters; and their names were
          <a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>,
          <a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and
          <a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
          and they lived at the bottom of a well.</p>
          
          <p class="story">...</p>
          """
          from bs4 import BeautifulSoup
          soup = BeautifulSoup(html_doc, 'html.parser')
          
          # 獲取title標簽
          soup.title
          # <title>The Dormouse's story</title>
          
          #獲取title標簽名字
          soup.title.name
          # u'title'
          
          #獲取title標簽文本內容
          soup.title.string
          # u'The Dormouse's story'
          
          #獲取title父標簽
          soup.title.parent.name
          # u'head'
          
          #獲取p標簽
          soup.p
          # <p class="title"><b>The Dormouse's story</b></p>
          
          #獲取p標簽的class屬性
          soup.p['class']
          # u'title'
          
          # 獲取a標簽
          soup.a
          # <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>
          
          # 查找所有的a標簽
          soup.find_all('a')
          # [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,
          #  <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,
          #  <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]
          
          # 查找id為link3的標簽
          soup.find(id="link3")
          # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>

          對象種類

          雖然在 Beautiful Soup 中可以將復雜的 HTML 文檔轉換為樹形結構,但是從大體可歸納為以下 4 個對象:

          Tag:Tag 對象用于表示 HTML 和 XML 文檔中的 tag 標簽。

          soup = BeautifulSoup('<b class="boldest">Extremely bold</b>')
          tag = soup.b
          type(tag)
          # <class 'bs4.element.Tag'>
          
          tag.name
          # u'b'
          
          tag['class']
          # u'boldest'

          如上任何的標簽在Beautiful Soup 都表示為一個 Tag 對象,且從該對象上獲取到當前標簽的各種屬性值。

          NavigableString :表示 Tag 中被包裹的字符串

          tag.string
          # u'Extremely bold'
          type(tag.string)
          # <class 'bs4.element.NavigableString'>

          BeautifulSoup :該對象表示文檔整體的一個類,即初始化后獲得的類,所以獲取到該類,就獲取到了整個文檔。需要注意需要和上邊 Tag 類做出區分,BeautifulSoup 類是特殊的 Tag 類。

          Comment :表示文檔中的注釋內容,其本質也是一個特殊的NavigableString 對象,但由于其特殊性,單獨做封裝處理。

          使用 CSS 選擇器選擇節點

          除了上邊的屬性選擇器和方法選擇器外,Beautiful Soup 還提供 CSS 選擇器,這對于有前端樣式開發經驗的同學來說是非常給力的一個特性。通過 CSS 選擇器也可以輕松的選定各個節點,但在使用中和上邊的有所不同需要調用 .selsect() 方法, 如下方代碼:

          soup.select("title")
          # [<title>The Dormouse's story</title>]
          
          soup.select("p:nth-of-type(3)")
          # [<p class="story">...</p>]

          有不熟悉css選擇器的小伙伴可以在w3c上學習,一般基礎的選擇器就可勝任絕大多數數據獲取的任務。


          主站蜘蛛池模板: 一区二区三区人妻无码| 日韩熟女精品一区二区三区| 久久精品免费一区二区| 91精品国产一区| 国产主播福利一区二区| 日美欧韩一区二去三区| 福利片免费一区二区三区| 国产一区二区三区在线观看影院| 国产伦精品一区二区三区无广告| 立川理惠在线播放一区| 国产精品成人一区二区| 亚洲AV无码一区二区二三区软件 | 国产福利一区二区精品秒拍| 国产中文字幕一区| 黑人大战亚洲人精品一区| 中文字幕一区一区三区| 国产精品一区二区资源| 国产人妖视频一区二区| 国产精品无码一区二区三区毛片| 色多多免费视频观看区一区| 美女一区二区三区| 韩国资源视频一区二区三区| 久久无码一区二区三区少妇| 色欲AV蜜臀一区二区三区| 日本精品视频一区二区三区| 国产探花在线精品一区二区| 天美传媒一区二区三区| 日本一区二区不卡在线| 国产成人AV区一区二区三 | 中文字幕日韩人妻不卡一区| 亚洲一区在线视频| 国产高清在线精品一区小说| 精品国产一区二区三区色欲 | 熟妇人妻一区二区三区四区| 亚洲日韩AV一区二区三区四区| 久久成人国产精品一区二区| 九九无码人妻一区二区三区| 久久福利一区二区| 亚洲国产成人久久一区WWW| 欲色aV无码一区二区人妻| 激情综合一区二区三区|