爬虫里面最难的问题就是捕获数据,而捕获数据现在市面上至少有四种方法:
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