天天看點

python爬蟲之BeautifulSoup4遇坑記

#!/usr/bin/python
# -*- coding: UTF-8 -*-
from urllib import request
from bs4 import BeautifulSoup

html = request.urlopen("https://movie.douban.com/")
bs = BeautifulSoup(html, "lxml-xml")
print(bs.title)

           

到目前為止,我知道的py36和37中的parser隻能選擇html-parser和html5lib而lxml和lxml-xml不能用

先說下經過:

1.run

2.報錯如下

D:\Users\lunjiawang\wlj\devkit\anaconda\install\python.exe D:/Users/lunjiawang/PycharmProjects/script/src/Practice.py
Traceback (most recent call last):
  File "D:/Users/lunjiawang/PycharmProjects/script/src/Practice.py", line 7, in <module>
    bs = BeautifulSoup(html, "lxml-xml")
  File "D:\Users\lunjiawang\wlj\devkit\anaconda\install\lib\site-packages\bs4\__init__.py", line 198, in __init__
    % ",".join(features))
bs4.FeatureNotFound: Couldn't find a tree builder with the features you requested: lxml-xml. Do you need to install a parser library?

Process finished with exit code 1
           

3.第一反應 Do you need to install a parser library?這句導緻我以為自己的lxml包沒有安裝,故使用

pip install lxml           

因為我是用的conda是以比較友善,但是這導緻一個信任問題:conda真的把我要的包導進來了嗎?在安裝完之後還不行的情況下,我産生了這樣的想法,是以開始google

4.google出來的答案基本一緻:lxml版本不相容(後來想想話是沒說錯,倒是容易産生迷惑),根據網上的大神(基本都是stackOverflow,github啥的),下載下傳4.0.0的版本,用的amd64 cp35\36下載下傳,然後用pip install 檔案目錄安裝。不行,報錯原因簡單:not support in this platform

python爬蟲之BeautifulSoup4遇坑記

5.顯而易見,平台不支援,當時的想法是系統平台,而不是py平台,繼續找該問題的方法

6.直到有個網友說win10 py35需要下載下傳3.7.2之前的版本,一臉懵逼,然後我想,既然4.0.0不行,那麼py35和我的37應該差别不大,有可能還是lxml版本問題(沒錯啊,就是迷惑了),是以下了3.7的(其實在下載下傳4.0.0的時候我就嘗試下了3.8也不行,心想不會就一牆之隔吧),滿心激動,安裝-報錯,此時都有點郁悶了

7.繼續找答案,在StackOverflow上有個家夥說他是py37的下載下傳4.2.5 cp37版本的lxml就好了。嗯?cp37?難道?35\36\37都是lxml版本的意思?對啊,吐血,這樣說,我37之前一直下載下傳4.2.5之前的版本不是找死嗎?因為沒有cp37啊。

8到此未知,雖然問題沒有解決,但是發現自己的方向找錯了。我的lxml版本沒問題,有問題的是???是什麼?

9.繼續尋找,到源碼看看吧,發現有如下

:param features: Desirable features of the parser to be used. This
        may be the name of a specific parser ("lxml", "lxml-xml",
        "html.parser", or "html5lib") or it may be the type of markup
        to be used ("html", "html5", "xml"). It's recommended that you
        name a specific parser, so that Beautiful Soup gives you the
        same results across platforms and virtual environments.           

咦,好像parser有好多個,不僅僅隻有lxml嘛。難道?這個跟py版本有關?為了驗證這個想法,繼續google

10.狂輸:

py37 Couldn't find a tree builder with the features you requested           

老天不負苦心人,終于有個CSDN老哥

ssITt猿

寫了個py36 Couldn't find a tree builder with the features you requested:的文章,既然找不到37的就用36試試呗,裡面給了方法:

在報錯代碼中把函數參數中所有的"lxml"改成"html.parser"
例子:

bs = BeautifulSoup(r, 'lxml')
 #改成 bs = BeautifulSoup(r, 'html.parser')           

11.調整,run 成功了

總結:這個過程,我一直在抱怨python怎麼這麼麻煩,包也沒有人管理,下載下傳個三方包還需要自己手動pip,依賴沒人管理,下錯了就給你error,社群(包括網站),更新的是勤快,但是有py、pip更新的勤快嘛?說不定下周我這個parser又不管用,又不知道會坑死多少人

話說回來,從這個小bug中發現自己的思路還是有點問題:首先,遇到問題馬上google,這個不太好,最好的方法就是源碼,看最底層的東西,如果是剛學習一個工具、語言、軟體啥的,最好是從doc裡面汲取最官方的東西(隻是全英文了解起來不是很容易,但是很詳細很完整,大家可以看我其他部落格裡面對es的官網翻譯,最近也在逼自己看原文);其次,動手能力差,其實很早就看到有很多parser,但是因為沒想到跟這個有關就沒有一個個試,總期待别人給現成的答案。再者,獨立思考的能力也很重要,很明顯這次的邏輯應該是:conda已經幫我安裝了lxml包,但是程式報包找不到,說明程式這個報錯隻是表象,而不能輕易相信包的版本有問題。然後應該看前面一句報錯:

Couldn't find a tree builder with the features you requested: lxml-xml           

找不到lxml-xml這個features,那麼我的包沒問題,隻是features有問題,此時進入源碼發現有很多features,換一個試試就完了

哎,邏輯太重要,我總是想的比較複雜,歸根結底還是因為沒有很好的獨立思考的能力,

願與大家共勉共進步