此學習筆記整理于 Ryan Mitchell Web Scraping with Python- Collecting Data from the Modern Web (2015) Chapter 2 Advanced HTML Parsing
首先說明下我為什么要用這本書貌踏,因為這本書并不是入門書籍层皱。那么我是不是小白呢!肯定是,那么為什么不用入門書籍呢?原因在于我之前自學過Python,然后斷了,然后再學,然后再斷纸泡。所以就選了這本,硬著來吧赖瞒。
一女揭,來蚤假,說一個函數(shù)吧。findAll
findAll(tag, attributes, recursive, text, limit, keywords)?
第一個參數(shù)吧兔,tag磷仰。即上圖中的span,string或者list (string就是文本境蔼,list就是列表灶平,都是Python中的單元,可以查下看下就行箍土,不查也行逢享,字面意思,可能有些語法問題吴藻,暫時也不用知道吧)
第二個參數(shù)瞒爬,attributes。即上圖中的class=‘red’沟堡。dictionary (dictionary就是字典侧但,key和value,即有鍵和值(鍵可以理解為索引)弦叶,class是鍵俊犯,red是值)
第三個參數(shù),recursive伤哺。我們打開的html形式的內容類似樹狀結構。如下圖者祖。這個參數(shù)就是問你是否要深挖結構立莉,如果不深挖,就是大的樹枝七问,如果深挖蜓耻,set it true,就是大樹枝挖完后還要挖大樹枝上面的小樹枝械巡。例如刹淌,span下面如果還有一個低層級的span。當然了我也不知道有沒有這樣的結構讥耗,只是理解有勾。默認值是True,深挖古程,畢竟是findAll蔼卡。
第四個參數(shù),text挣磨。作者說不常用雇逞,就是找對應的text荤懂。可以算出來對應的text在page里面出現(xiàn)了幾次塘砸。findAll(text='XX')
第五個參數(shù)节仿,limit,就是找?guī)讉€吧掉蔬。
第六個參數(shù)廊宪,keywords.直接上attributes我的理解,class=‘red’眉踱。作者說了挤忙,一般不用keywords,因為class是Python的保留詞谈喳,雖然也可以加一個小橫線class_=‘red’來用册烈,但是也可以用 findAll(“”,{“class”:"red")來替代findAll(class_='red')婿禽。作者又說了赏僧,keywords可以幫我們進一步refine我們的內容,進一步篩選扭倾。
findAll是根據(jù)名字和屬性attributes來確定tags的淀零。
ok,函數(shù)說完膛壹。
下面的是如何根據(jù)位置來確定需要的tag的驾中。
主要的就是兩點,父子關系模聋,后代和姐妹關系肩民。children & parent,descendants and siblings。
在兄弟姐妹關系上,跳過了第一個祟蚀,因為是next_siblings.同樣的還有next_sibling工窍。單數(shù)的兄弟姐妹
還有就是previous_sibling and previous_siblings。
二前酿,正則表達式
先來一個笑話吧
Let’s say you have a problem, and you decide to solve it with regular expressions. Well, now you have two problems患雏。
但我覺得,既然決定了要學Python薪者,so, the only thing we have to fear is fear itself. 如果有一天我停更了纵苛,真是啪啪打臉啊。
舉個栗子
下面有幾個規(guī)則:
1,a至少寫1遍攻人,開頭
2取试,后面正好跟了5個b
3,后面跟了偶數(shù)個c
4怀吻,最后d可選結尾瞬浓。
感覺很直觀吧!ok蓬坡,rewrite in regular expression. regex
aa*bbbbb(cc)*(d | )
a 一個a
a* 若干個a猿棉,從0開始計數(shù)
(cc)這樣的組合cc
(cc)* 這樣的如何若干次
d | ?d or nothing
(d | )這樣的組合
完成!
三屑咳,結合
需要加載re import re
\. 表示.
\/ 表示/
../img/gifts/imgXX.jpg (XX表示一位數(shù)或者兩位數(shù)或者多位數(shù))
四萨赁,lambda表達式
lambda表達式省去了定義函數(shù)的麻煩,直接用兆龙!findAll支持lambda表達式杖爽,但是!有一個前提紫皇,這個lambda的參數(shù)是tag慰安,返回值是邏輯值boolean。
舉個栗子
P.S.:沒能上車的小伙伴歡迎留言聪铺,如果我會我直接回答你化焕!如果不會,我谷歌后回答你铃剔!如果要加我微信撒桨,不行。