Python經常使用的幾個解析庫的學習整理。BeautifulSoup。

這將會是一系列的文章,整理本身以前學習爬蟲的各個模塊,只是粗略的過一下,介紹部分簡單實例。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>
"""

 

BeautifulSoup

  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

tag就是HTML的一個個標籤。

例如HTML中的 head,title,a,p等等。

在實際操做中,咱們會將所須要的標籤經過選擇器查找出來,而後經過操做Tag對象來獲取所需信息。在BeautifulSoup中,經常使用的findAll()和find()來搜索文檔樹來獲取本身所需的標籤。同時,BeautifulSoup也支持CSS語法來搜索,select()方法,返回的類型是list。

 

ps:

1.findAll()等同於find_all()

2.對前端比較瞭解的,用select()方法比較順手。

 

(1)findAll(name,attrs,recursive,text,**kwargs)

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()

find()至關於findAll()中limit=1的時候,不過find()返回的是結果,findAll()返回的是一個列表。

 

CSS選擇器

  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經常使用的功能

相關文章
相關標籤/搜索