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 高度魯棒性爬蟲的異常和超時問題