這將會是一系列的文章,整理自己之前學習爬蟲的各個模塊,只是粗略的過一下,介紹部分簡單實例。
從接觸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常用的功能