XPath 即为XML路径语言(XML Path Language),它是一种用来确定XML文档中某部分位置的语言。它使用路径表达式来选取 XML 文档中的节点或节点集。节点是通过沿着路径 (path) 或者步 (steps) 来选取的。 XPath语法
import pip; print(pip.pep425tags.get_supported())
可以获取到pip支持的文件名还有版本python2 -m pip install wheel
python2 -m pip install lxml-3.8.0-cp27-none-win32.whl
wheel名一定要跟pip支持的文件名和版本符合text()
是一个node test,而string()
是一个函数,data()是一个函数且可以保留数据类型。此外,还有点号(.)表示当前节点。<book><author>_知几</author></book>
用例 | 举例 |
---|---|
text() | book/author/text() |
string() | book/author/string() |
data() | book/author/data() |
. | book/author/. |
XML例子:
<book> <author>python<em>django</em>爬虫</author> <pricing> <price>20</price> <discount>0.8</discount> </pricing> </book>
text()
text()
,它仅仅返回所指元素的文本内容。let $x := book/author/text() return $x 返回的结果是python 爬虫,其中的django不属于author直接的节点内容。
string()
string()
函数会得到所指元素的所有节点文本内容,这些文本讲会被拼接成一个字符串。let $x := book/author/string() return $x 返回的内容是python django 爬虫。
data()
data()
函数和string()
函数通用,而且不建议经常使用data()
函数,有数据表明,该函数会影响XPath的性能。let $x := book/pricing/string() return $x 返回的是200.8 let $x := book/pricing/data() return $x 这样将返回分开的20和0.8,他们的类型并不是字符串而是>xs:anyAtomicType,于是就可以使用数学函数做一定操作。 let $x := book/pricing/price/data() let $y := book/pricing/discount/data() return $x*$y 比如上面这个例子,就只能使用
data()
,不能使用text()
或string()
,因为XPath不支持字符串做数学运算。
text()
不是函数,XML结构的细微变化,可能会使得结果与预期不符,应该尽量少用,data()
作为特殊用途的函数,可能会出现性能问题,如无特殊需要尽量不用,string()
函数可以满足大部分的需求。
(1)分析小说网址构成;
(2)获取网页,并分离出小说章节名和章节内容;
(3)写入txt文档。
# -*- coding:utf-8 -*- import urllib,urllib2,re from lxml import etree #定义函数,爬取对应的数据 def getText(url,file_name): print('开始爬取第%s章的内容'%file_name) #伪装请求头 my_headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.104 Safari/537.36', } request = urllib2.Request(url,headers=my_headers) content = urllib2.urlopen(request).read() return content #定义函数,保存爬取到的数据 def save(content): xml = etree.HTML(content) datas = xml.xpath('/html/body/div[@id="main"]/h1 | /html/body/div[@id="main"]/p') data = datas[2].xpath('string(.)').encode('utf-8') name = datas[0].xpath('string(.)') print name print('第%s章的内容爬取完成' % file_name) with open('txt/%s'%name+'.txt', 'wb') as f: f.write(data) #定义主程序接口 if __name__ == '__main__': x=41277 while x<x+50: url = 'http://www.ty2016.net/net/zhuxian/'+str(x)+'.html' x+=1 file_name = str(x-41278) try: content = getText(url,file_name) save(content) except Exception,a: print a
从本地可以看到已经爬取到相关内容 注解:Xpath的获取
本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。
我来说两句