此學習筆記整理于 Ryan Mitchell Web Scraping with Python- Collecting Data from the Modern Web (2015) Chapter 2 Advanced HTML Parsing
首先說明下我為什么要用這本書,因為這本書并不是入門書籍。那么我是不是小白呢!肯定是,那么為什么不用入門書籍呢?原因在于我之前自學過Python,然后斷了,然后再學,然后再斷。所以就選了這本,硬著來吧。
一,來,說一個函數吧。findAll
findAll(tag, attributes, recursive, text, limit, keywords)?
第一個參數,tag。即上圖中的span,string或者list (string就是文本,list就是列表,都是Python中的單元,可以查下看下就行,不查也行,字面意思,可能有些語法問題,暫時也不用知道吧)
第二個參數,attributes。即上圖中的class=‘red’。dictionary (dictionary就是字典,key和value,即有鍵和值(鍵可以理解為索引),class是鍵,red是值)
第三個參數,recursive。我們打開的html形式的內容類似樹狀結構。如下圖。這個參數就是問你是否要深挖結構,如果不深挖,就是大的樹枝,如果深挖,set it true,就是大樹枝挖完后還要挖大樹枝上面的小樹枝。例如,span下面如果還有一個低層級的span。當然了我也不知道有沒有這樣的結構,只是理解。默認值是True,深挖,畢竟是findAll。
第四個參數,text。作者說不常用,就是找對應的text。可以算出來對應的text在page里面出現了幾次。findAll(text='XX')
第五個參數,limit,就是找?guī)讉€吧。
第六個參數,keywords.直接上attributes我的理解,class=‘red’。作者說了,一般不用keywords,因為class是Python的保留詞,雖然也可以加一個小橫線class_=‘red’來用,但是也可以用 findAll(“”,{“class”:"red")來替代findAll(class_='red')。作者又說了,keywords可以幫我們進一步refine我們的內容,進一步篩選。
findAll是根據名字和屬性attributes來確定tags的。
ok,函數說完。
下面的是如何根據位置來確定需要的tag的。
主要的就是兩點,父子關系,后代和姐妹關系。children & parent,descendants and siblings。
在兄弟姐妹關系上,跳過了第一個,因為是next_siblings.同樣的還有next_sibling。單數的兄弟姐妹
還有就是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,后面跟了偶數個c
4,最后d可選結尾。
感覺很直觀吧!ok,rewrite in regular expression. regex
aa*bbbbb(cc)*(d | )
a 一個a
a* 若干個a,從0開始計數
(cc)這樣的組合cc
(cc)* 這樣的如何若干次
d | ?d or nothing
(d | )這樣的組合
完成!
三,結合
需要加載re import re
\. 表示.
\/ 表示/
../img/gifts/imgXX.jpg (XX表示一位數或者兩位數或者多位數)
四,lambda表達式
lambda表達式省去了定義函數的麻煩,直接用!findAll支持lambda表達式,但是!有一個前提,這個lambda的參數是tag,返回值是邏輯值boolean。
舉個栗子
P.S.:沒能上車的小伙伴歡迎留言,如果我會我直接回答你!如果不會,我谷歌后回答你!如果要加我微信,不行。