這將會是一系列的文章,整理本身以前學習爬蟲的各個模塊,只是粗略的過一下,介紹部分簡單實例。html
從接觸python爬蟲到如今,基本上用過了全部經常使用的解析庫。前端
lxml,BeautifulSoup,pyquery。固然了,還有re。html5
我的認爲前端基礎比較紮實的,用pyquery是最方便的,固然了,beautifulsoup也不錯,re速度比較快,可是寫正則比較麻煩。python
lxml的速度也是相對較快的,建議使用。程序員
固然了,既然用python,確定仍是本身用着方便最好。正則表達式
首先介紹beautifulsoup這個庫,由於最開始接觸爬蟲的時候,就看到你們強力推薦這個庫。後來用了下,覺着確實不錯。可是程序員嘛,哪能在一個庫裏悶死,哈哈。python爬蟲
幾個庫的安裝過程就再也不累述,參考anaconda。-_-.學習
後面幾個實例,均用這個來測試。測試
html = """ <html><head><title>The Dormouse's story</title></head> <body> <p class="myclass" name="dromouse"><b>The Dormouse's story</b></p> <p class="story">Once upon a time there were three little sisters; and their names were <a href="http://example.com/elsie" class="myclass" id="box"><!-- Elsie --></a>, <a href="http://example.com/lacie" class="myclass" id="box1">Lacie</a> and <a href="http://example.com/tillie" class="myclass" id="box2">Tillie</a>; and they lived at the bottom of a well.</p> <p class="story">...</p> """
Beautiful Soup支持Python標準庫中的HTML解析器,還支持一些第三方的解析器。例如lxml HTML,lxml XML,html5lib。不過要安裝這些庫,不然它會使用python的內部標準庫。spa
beautifulsoup的對象建立有兩種方式。
1. soup=BeautifulSoup(html) #用變量內容來建立
2. soup=BeautifulSoup('mysite.html') #用本地文件來建立
BeautifulSoup是將HTML轉化爲一個複雜的樹形結構,每一個節點都是python對象,有前端基礎的同窗會知道,相似DOM對象。BeautifulSoup中的對象大體有四種,Tag、NavigableString、BeautifulSoup、Comment。因爲咱們平時操做大多數是針對一個個標籤提取信息,因此我簡略的敘述下經常使用到的Tag對象。
tag就是HTML的一個個標籤。
例如HTML中的 head,title,a,p等等。
在實際操做中,咱們會將所須要的標籤經過選擇器查找出來,而後經過操做Tag對象來獲取所需信息。在BeautifulSoup中,經常使用的findAll()和find()來搜索文檔樹來獲取本身所需的標籤。同時,BeautifulSoup也支持CSS語法來搜索,select()方法,返回的類型是list。
ps:
1.findAll()等同於find_all()
2.對前端比較瞭解的,用select()方法比較順手。
1.name參數能夠查找全部名爲name的tag,字符串對象會自動忽略。對於name參數,能夠傳入下列對象。
a)字符串:最簡單的過濾器是字符串.在搜索方法中傳入一個字符串參數,Beautiful Soup會查找與字符串完整匹配的內容,下面的例子用於查找文檔中全部的<p>標籤.
例:
soup.findAll('p')
#會返回全部p標籤
b)正則表達式:傳入的正則表達式做爲參數時,BeautifulSoup會經過re.match()來匹配內容。
例: soup.findAll(re.compile('^b')) #默認已導入re
#本語句會查找全部b開頭的標籤,例如:body,b
c)傳列表:傳入列表時,BeautifulSoup會將全部與列表中任一匹配的元素返回。
例: soup.findAll(['p','title'])
經常使用的就這3個,還有傳方法和傳真。
2.keyword參數(若是一個指定名字的參數不是搜索內置的參數名,搜索時會把該參數看成指定名字tag的屬性來搜索,若是包含一個名字爲 id 的參數,Beautiful Soup會搜索每一個tag的」id」屬性。當想用class的時候,因爲class是python的關鍵詞,不能直接用,能夠用class_代替class)
soup.findAll(id='box')#找出id值爲box的tag soup.findAll(href=re.compile('baidu'))#href包含‘href’的tag soup.findAll(href=re.compile('baidu'),id='box1)#傳入多個參數,找出同時知足兩個條件的tag soup.findAll(class_='myclass')#找出class值爲myclass的tag,注意下劃線不能少 #特殊的參數能夠定義字典參數來查找。查找多個參數時,也能夠用此方法 soup.findAll(attrs={'class':'myclass','id'='box'})
3.text參數
經過傳入text參數能夠搜索文檔中與字符串內容相同的內容。(不經常使用)。可傳入的與name同樣。
實例,略。
4.limit參數
用於限制返回搜索的結果數,當搜索的達到limit限制時,就中止搜索返回搜索結果。
ps:find()至關於findAll()中limit=1的時候。
實例,略
5)recursive參數
recursive的默認參數爲True,BeautifulSoup會查找全部後代節點,而只想搜索子節點時,可設置參數爲False。
實例,略。
find()至關於findAll()中limit=1的時候,不過find()返回的是結果,findAll()返回的是一個列表。
beautifulsoup支持CSS語法的選擇器來查找所須要的標籤。
select(CSS選擇器) 例: soup.select('.myclass #box') #後代選擇器 soup.select('head>title') #子選擇器 soup.select('div+p') #相鄰兄弟選擇器 soup.select('div~p’) #後續兄弟選擇器
同時還能夠加入屬性查找。
soup.select('.myclass a[id="box"]')
select()方法返回的是列表形式。
以上差很少就是BeautifulSoup經常使用的功能