Python网络爬虫(四)- XPath1.XPath2.XPath在python中的应用

目录:

1.XPath

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

2.XPath在python中的应用

  • xpath的安装
    • 通过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()区别

1.XPath中的text()和string()本质区别
  • text()是一个node test,而string()是一个函数,data()是一个函数且可以保留数据类型。此外,还有点号(.)表示当前节点。

2.XML例子:

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

用例

举例

text()

book/author/text()

string()

book/author/string()

data()

book/author/data()

.

book/author/.

3.特殊用例

XML例子:

<book>
    <author>python<em>django</em>爬虫</author>
    <pricing>
        <price>20</price>
        <discount>0.8</discount>
    </pricing>
</book>
  • 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<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的获取

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏玄魂工作室

PYTHON黑帽编程 4.1 SNIFFER(嗅探器)之数据捕获--补充

荒废了一个多月了,重新捡起来,手生了不少。发现在《4.1下》的文章里没有 提到pcap库,实在是不应该。 在网络数据分析的工具中,tcpdump绝对是大名鼎鼎,...

4037
来自专栏抠抠空间

Flask之WTForms

WTForms是一个支持多个web框架的form组件,主要用于对用户请求数据进行验证。

1143
来自专栏地方网络工作室的专栏

Python3 初学实践案例(3)argparse 命令行参数库的使用

Python3 初学实践案例(3)argparse 命令行参数库的使用 在前面一篇博文中 http://blog.csdn.net/fungleo/articl...

4719
来自专栏分布式系统进阶

Kafka集群建立过程分析

992
来自专栏崔庆才的专栏

Scrapy框架的使用之Spider的用法

1803
来自专栏大内老A

从数据到代码——基于T4的代码生成方式

在之前写一篇文章《从数据到代码》(上篇、下篇)中,我通过基于CodeDOM+Custom Tool的代码生成方式实现了将一个XML表示的消息列表转换成了相应的C...

3008
来自专栏代码世界

Flask之wtforms

WTForms是一个支持多个web框架的form组件,主要用于对用户请求数据进行验证。

1423
来自专栏美团技术团队

Node.js Stream - 实战篇

背景 前面两篇(基础篇和进阶篇)主要介绍流的基本用法和原理,本篇从应用的角度,介绍如何使用管道进行程序设计,主要内容包括: 管道的概念 Browserify的...

3805
来自专栏Python

wtforms

 简介 WTForms是一个支持多个web框架的form组件,主要用于对用户请求数据进行验证。 安装: ? 1 pip3 install wtf...

2297
来自专栏崔庆才的专栏

Scrapy框架的使用之Scrapy通用爬虫

3116

扫码关注云+社区

领取腾讯云代金券