爬蟲裡面最難的問題就是捕獲資料,而捕獲資料現在市面上至少有四種方法:
1)利用urllib.request.urlopen(url)獲得的源代碼是str模式,使用.find找到頭和尾的光标位,然後利用[光标位1:光标位2]來擷取内容;
2)正規表達式,即(.*?),雖然正則在寫上面最無腦,但是錯誤率最高,捕獲網頁用處實在不大,捕獲一些文本檔案的時候還可以一用。而且(.*?)能搜尋開頭值不能搜尋末尾值,如下圖。
<a href="http://s4.51cto.com/wyfs02/M01/79/27/wKiom1aKHqDA24uHAADIbfHvH54265.png" target="_blank"></a>
3)Beautiful Soup,這個相對要好一點,先from bs4 import BeautifulSoup啟動子產品,然後 soup=beautiful.soup(url,"html.parser",from-encoding="utf-8")解析網頁源代碼,然後soup.find_all(對應的節點标簽),輸出即可。
4)Xpath,這玩意目前好像隻能支援2.7,沒有支援3.5版本的。而且mysql要連結python的話,官方插件隻能認可2.7,是以說裡外裡都要回歸2.7。
Xpath的操作步驟,先from lxml from etree啟動子產品,然後selector=etree.HTML(url)來将html轉成etree識别的東西,再設定一個變量=selextor.xpath(節點路徑),然後輸出
做一個Xpath的例子。
html='''
<html>
<head lang="en">
<meta charset="utf-8">
<title>TEST</title>
</head>
<body>
<div id="content">
<ul id="useful">
<li>THIS IS FIRST MESSAGE!</li>
<li>THIS IS SECOND MESSAGE!</li>
<li>THIS IS THIRD MESSAGE!</li>
</ul>
<ul id="useless">
<li>ONE no</li>
<li>TWO no</li>
<li>THREE no</li>
<div id="url">
<a href="http://www.baidu.com" title="nishiruozhi">BAIDU</a>
<a href="http://www.sina.com.cn" title="woshitiancai">SINA</a>
</div>
</div>
</body>
</html>'''
from lxml import etree
selector=etree.HTML(html)
content=selector.xpath('//body/div/ul[@id="useful"]/li/text()')
print content[0]
這個的輸出結果就是:THIS IS FIRST MESSAGE
若改成
for each in content:
print(each)
這個的輸出結果就是:
THIS IS FIRST MESSAGE!
THIS IS SECOND MESSAGE!
THIS IS THIRD MESSAGE!
本文轉自 蘇幕遮618 51CTO部落格,原文連結:http://blog.51cto.com/chenx1242/1731398