美文网首页python热爱者Python新世界
忍不住想收藏的好文,熬夜写了Python爬虫的XPath技术全解

忍不住想收藏的好文,熬夜写了Python爬虫的XPath技术全解

作者: 48e0a32026ae | 来源:发表于2018-11-22 19:28 被阅读3次

    学习Python中有不明白推荐加入交流群

                    号:516107834

                    群里有志同道合的小伙伴,互帮互助,

                    群里有不错的学习教程!

    欢迎各位宝宝回来,准备好继续学习了吗?

    继续我们的进阶之旅吧~

    如果现在觉得有点跟不上的话,你可以查看之前的文章再次进行复习哦~

    也建议您好好地做下笔记,毕竟好记性不如烂笔头!

    收好我的小心心,

    咱们准备开始吧~~

    目录

    · Python网络爬虫(一)- 入门基础

    · Python网络爬虫(二)- urllib爬虫案例

    · Python网络爬虫(三)- 爬虫进阶

    · Python网络爬虫(四)- XPath(本节内容)

    · Python网络爬虫(五)- Requests和Beautiful Soup

    · Python网络爬虫(六)- Scrapy框架

    · Python网络爬虫(七)- 深度爬虫CrawlSpider

    · Python网络爬虫(八) - 利用有道词典实现一个简单翻译程序

    1.XPath

    XPath 即为XML路径语言(XML Path Language ),它是一种用来确定XML文档中某部分位置的语言。它使用路径表达式来选取 XML 文档中的节点或节点集。节点是通过沿着路径 (path) 或者步 (steps) 来选取的。

    XPath语法

    2.XPath在python中的应用

    · xpath在Python中有一个第三方库,支持~ lxml

    注意:不要直接使用pip install lxml去安装~直接安装很容易安装一个空壳!

    · 安装pip,主要参考博客:

    python实践系列之(一)安装

    python︱模块加载(pip安装)以及pycharm安装与报错解决方式

    在shell中输入import pip; print(pip.pep425tags.get_supported())可以获取到pip支持的文件名还有版本

    · xpath(lxml)的安装

    通过wheel方式安装

    下载对应的wheel文件【和Python版本对应的】

    安装wheel插件 :python2 -m pip install wheel

    根据下载的本地文件安装lxml:切换到whl文件所在的路径,进行安装

    python2 -m pip install lxml-3.8.0-cp27-none-win32.whlwheel名一定要跟pip支持的文件名和版本符合

    ·

    xpath的使用

    获取文本内容用 text()

    获取注释用 comment()

    获取其它任何属性用@xx,如

    @href

    @src

    @value

    Python-第三方库requests详解(各位自行搜索下,放不进来)

    CSS 选择器参考手册(各位自行搜索下,放不进来)

    3.XPath中的text()和string()区别

    3.1 XPath中的text()和string()本质区别

    · text()是一个node test,而string()是一个函数,data()是一个函数且可以保留数据类型。此外,还有点号(.)表示当前节点。

    3.2 XML例子:

    <book><author>_知几</author></book>

    用例举例

    text()book/author/text()

    string()book/author/string()

    data()book/author/data()

    .book/author/.

    3.3 特殊用例

    XML例子:

    pythondjango爬虫

    20

    0.8

    · text()

    经常在XPath表达式的最后看到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()函数可以满足大部分的需求。

    4.爬取诛仙前50章内容

    主要分三个步骤:

    (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

    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的获取

    获取数据的Xpath(动态图)

    又到了说再见的时候,但是还是会问大家一句,今天的你是否看文本篇文章又是满满的收获呢?亦或是今天有了慢慢的收获呢?一年可就又要悄悄溜走了呢?是否已经对今年的自己很满意了呢?其实,小编希望自己的努力没有白费,可以给大家更多的学习的知识的提升带来帮助。

    相关文章

      网友评论

        本文标题:忍不住想收藏的好文,熬夜写了Python爬虫的XPath技术全解

        本文链接:https://www.haomeiwen.com/subject/verrqqtx.html