標籤:

BeautifulSoup常見問題歸類

BeautifulSoup常見問題歸類

前言:

本文會一直更新, 作為我在Stack Overflow答題的一個總結.

問題一: 文本節點

首先看兩個HTML代碼:

這是你眼中的HTML代碼

<html> <body> <li> <a class="reference internal" href="#installing-beautiful-soup"> Installing Beautiful Soup </a> <ul> <li> <a class="reference internal" href="#problems-after-installation"> Problems after installation </a> </li> <li> <a class="reference internal" href="#installing-a-parser"> Installing a parser </a> </li> </ul> </li> </body></html>

這是計算機眼中的HTML代碼:

<html>
<body>
<li>
<a class="reference internal" href="#installing-beautiful-soup">
Installing Beautiful Soup
</a>
<ul>
<li>
<a class="reference internal" href="#problems-after-installation">
Problems after installation
</a>
</li>
<li>
<a class="reference internal" href="#installing-a-parser">
Installing a parser
</a>
</li>
</ul>
</li>
</body>
</html>

結論: 在BS4中, 我們在HTML中看到的換行符以及空格都是NavigableString 也就是文本節點.

問題二: 濫用遍歷文檔樹的方法

常見的方法有:

  • contents
  • descendants
  • parent
  • next_sibling
  • next_element

這些方法都會遍歷文檔樹中的所有節點, 包括文本節點. 也就是說: 只要你使用這些方法, 你就一定會選擇出許多文本節點, 因為文本節點無處不在: 換行, 空格等.

解決方法: 使用過濾器find等方法:

soup.find(name=tagname)

當我們一旦在過濾器中指定了name關鍵字, 那麼返回的結果就一定是tag對象, 因為文檔節點沒有name屬性.

結論: 大多數情況下, 你需要的是find 這一類過濾器, 而不是遍歷所有節點.

問題三: html.parser

html.parser是個令人又恨又愛的解析器, 它是Python內置的解析器, 開箱即用. 但是在一些情況下, 它解析出來的文檔會丟失信息. 如果你發現你的文檔信息缺少了, 那麼試著換其他解析器,例如: lxml

問題四: 動態頁面(JavaScript)

雖然這個問題不屬於BeautifulSoup, 但是經常被提出來. 有很多情況下, 我們發現文檔中返回的信息缺失了, 首先應該想到的時動態頁面, 其次是解析器異常(參考問題三). 要避免這個問題很簡單:

  • 把瀏覽器中的JavaScript禁用, 然後刷新頁面, 觀察是否有信息缺失. 同時各個瀏覽器都有相應插件可以一鍵禁用和啟用JS.

  • 如果我們要爬取的頁面在載入時需要我們等待數據載入, 那麼也可以斷定是JS.

推薦閱讀:

一行正則抓取糗事百科
如何入門 Python 爬蟲?
運用python爬蟲批量抓取網頁圖片
python 高度魯棒性爬蟲的異常和超時問題

TAG:爬虫 | Python |