CodeGym /Java Adesua /Python SELF TW /從複雜的HTML結構中提取數據

從複雜的HTML結構中提取數據

Python SELF TW
等級 34 , 課堂 0
開放

1. 處理複雜HTML結構的基礎

在我們開始解析複雜的HTML之前,需要了解為什麼HTML可能會如此混亂。 網頁開發者經常使用複雜的嵌套元素來組織內容,這可能會讓嘗試從這類頁面提取數據的人陷入困境。 但不用擔心——只要有好的計劃和工具,你一定可以輕鬆應對這些挑戰!

解析HTML樹

想像HTML文件是一棵樹:每個元素是一個節點,可以包含文字或其他節點。 在這棵樹的頂部是html,接下來是headbody,而後是不同的子元素。 更深層的嵌套元素位於樹的底部。

簡單HTML結構的範例:

HTML

<html>
  <head>
    <title>範例</title>
  </head>
  <body>
    <div class="content">
      <h1>標題</h1>
      <p>段落 1</p>
      <p>段落 2</p>
      <div class="nested">
        <ul>
          <li>元素 1</li>
          <li>元素 2</li>
          <li><span>元素 3</span></li>
        </ul>
      </div>
    </div>
  </body>
</html>

如你所見,我們有一個帶有類別nesteddiv,內部包含一個 ul,而它又包含多個li。這就是元素嵌套的典型例子。

2. 使用BeautifulSoup提取數據

從嵌套元素中提取數據

回顧一下BeautifulSoup的工作原理。我們來用BeautifulSoup 從li列表中提取文字。是時候化身為數據偵探,收集我們的嵌套結構中的數據了。

Python

from bs4 import BeautifulSoup

soup = BeautifulSoup(html, 'html.parser')
nested_items = soup.select('.nested ul li')

for item in nested_items:
    print(item.get_text())

結果:


元素 1
元素 2
元素 3

如你所見,我們使用了select方法和CSS選擇器找到了所有li, 它們是嵌套在帶有nested類別的元素中的。 get_text()方法則讓我們直接從找到的元素中提取文字。

3. 處理多層級元素

有時,數據不僅位於結構的深處,還分散在不同的層級中,這使得提取數據的任務更加困難。 讓我們看看如何從更複雜的HTML樹中提取數據。

複雜結構範例:

HTML

<html>
  <body>
    <div class="wrapper">
      <div class="header">
        <h1>這是標題</h1>
      </div>
      <div class="content">
        <div class="article">
          <h2>文章 1</h2>
          <p>文章 1 的內容</p>
        </div>
        <div class="article">
          <h2>文章 2</h2>
          <p>文章 2 的內容</p>
        </div>
      </div>
      <div class="footer">
        <p>聯絡資訊</p>
      </div>
    </div>
  </body>
</html>

從層級中提取數據

現在我們來試試提取所有文章的標題和內容。

Python

articles = soup.select('.content .article')

for article in articles:
    title = article.find('h2').get_text()
    content = article.find('p').get_text()
    print(f'標題: {title}')
    print(f'內容: {content}\n')

預期輸出:


標題: 文章 1
內容: 文章 1 的內容

標題: 文章 2
內容: 文章 2 的內容

我們結合使用了selectfind方法來達成目標。 select幫助定位父元素,而find則負責提取子元素的數據。

4. 處理嵌套元素的特性

當你檢視網頁時,可能會遇到的問題之一是有多個嵌套元素使用了相同的類別或標籤。 在這種情況下,使用上下文搜尋和明確識別目標元素可以幫助避免錯誤。

複雜嵌套的範例:

HTML

<html>
  <body>
    <div class="container">
      <div class="item">
        <h2>編號 1</h2>
        <div class="details">細節 1</div>
      </div>
      <div class="item">
        <h2>編號 2</h2>
        <div class="details">細節 2</div>
        <div class="additional">
          <div class="info">額外資訊</div>
        </div>
      </div>
    </div>
  </body>
</html>

基於嵌套提取數據

為了避免混淆,我們應該找到更具體的元素:

Python

items = soup.select('.container .item')

for item in items:
    number = item.find('h2').get_text()
    details = item.select_one('.details').get_text()
    additional_info = item.select_one('.additional .info')
    
    print(f'編號: {number}')
    print(f'細節: {details}')
    
    if additional_info:
        print(f'額外資訊: {additional_info.get_text()}')
    print()

此處我們使用了select_one方法,它只返回第一個找到的元素, 以避免從額外區塊中獲取到重複數據。

5. 實踐中的問題和典型錯誤

在處理複雜的HTML結構時,很容易搞混或遇到錯誤。 其中一個典型的錯誤是嘗試訪問不存在的元素,導致AttributeError。 為了避免這種情況,應始終在操作元素之前檢查它是否存在。

另一個重要的技巧是,不要試圖一次性提取所有數據。 有時進行初步結構分析,利用除錯輸出並檢查中間結果,會對你的工作大有幫助。

在實際項目中,處理嵌套HTML結構的技能可能至關重要。 這不僅適用於網頁抓取,還適用於網頁界面的測試、自動化測試,甚至分析格式化的嵌套API響應數據。

留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION