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


這將會是一系列的文章,整理自己之前學習爬蟲的各個模塊,只是粗略的過一下,介紹部分簡單實例。

從接觸python爬蟲到現在,基本上用過了所有常用的解析庫。

lxml,BeautifulSoup,pyquery。當然了,還有re。

個人認為前端基礎比較扎實的,用pyquery是最方便的,當然了,beautifulsoup也不錯,re速度比較快,但是寫正則比較麻煩。

lxml的速度也是相對較快的,建議使用。

當然了,既然用python,肯定還是自己用着方便最好。

 

  首先介紹beautifulsoup這個庫,因為最開始接觸爬蟲的時候,就看到大家強力推薦這個庫。后來用了下,覺着確實不錯。但是程序員嘛,哪能在一個庫里悶死,哈哈。

幾個庫的安裝過程就不再累述,參考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的內部標准庫。

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM