xpath是一门在xml文档中查找信息的语言。xpath可以用来在xml文档中对元素和属性进行遍历。

在xpath中,有7中类型的节点,元素,属性,文本,命名空间,处理指令,注释及根节点。

节点

首先看下面例子:

<?xml version="1.0" encoding="ISO-8859-1"?>

<bookstore>

<book>
<title lang="en">Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book> </bookstore>

上面的节点例子:

<bookstore> (文档节点)
<author>J K. Rowling</author> (元素节点)
lang="en" (属性节点)

父:在上面的例子里,book是title,author,year,price的父。

子:反过来,title,author,year,price是book的子。

同胞:title,author,year,price是同胞。

先辈:title的先辈是book,bookstore。

后代:bookstore的后代是book,tite,author,year,price。

再看一个例子:

<?xml version="1.0" encoding="ISO-8859-1"?>

<bookstore>

<book>
<title lang="eng">Harry Potter</title>
<price>29.99</price>
</book> <book>
<title lang="eng">Learning XML</title>
<price>39.95</price>
</book> </bookstore

如何选取节点呢?

XPath 使用路径表达式在 XML 文档中选取节点。节点是通过沿着路径或者 step 来选取的。

对应上面的例子,得到结果:

谓语:谓语用来查找某个特定节点或者包含某个指定值的节点。

比如:

选取未知节点:

比如:

选取若干路径:通过在路径表达式中使用“|”运算符,您可以选取若干个路径。

常用xpath属性:

    # 找到class属性为song的div标签
//div[@class="song"]
层级定位:
# 找到class属性为tang的div直系字标签ul下的第二个字标签li下的直系字标签a
//div[@class='tang']/ul/li[2]/a
逻辑运算:
找到class属性为空且href属性为tang的a标签
//a[@class='' and @href='tang']
模糊定位
# 查找class属性值里包含'ng'字符串的div标签
//div[contains(@class, 'ng')]
# 配配class属性以ta为开头的div标签
//div[start_with(@class, 'ta')]
获取文本
//div[@class="song"]/p[1]/text()
获取属性
# 获取class属性为tang的div下的第二个li下面a标签的href属性
//div[@class="tang"]//li[2]/a/@href

在python中应用

将html文档或者xml文档转换成一个etree对象,然后调用对象中的方法查找指定节点。

1 本地文件:

  tree = etree.parse(文档)

  tree.xpath(xpath表达式)

2 网络数据:

  tree = etree.HTML(网页字符串)

  tree.xpath(xpath表达式)

例子1:随机爬取糗事百科糗图首页的一张图片

import requests
from lxml import etree
import random def main():
# 网页url
url = 'https://www.qiushibaike.com/pic/'
ua_headers = {"User-Agent": 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0)'}
# 网页代码
response = requests.get(url=url, headers=ua_headers).text
# 转换为etree对象
tree = etree.HTML(response)
# 匹配到所有class属性为thumb的div标签下的img标签的src属性值,返回一个列表
img_lst = tree.xpath('//div[@class="thumb"]//img/@src')
# 随机挑选一个图片并且下载下来
res = requests.get(url='https:'+random.choice(img_lst), headers=ua_headers).content
# 将图片保存到本地
with open('image.jpg', 'wb') as f:
f.write(res) if __name__ == '__main__':
main()

例子2:爬取煎蛋网首页的图片

import requests
from lxml import etree def main():
url = 'http://jandan.net/ooxx'
headers = {
"User-Agent": "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; en-us) AppleWebKit/534.50 (KHTML, like Gecko) "
"Version/5.1 Safari/534.50"}
response = requests.get(url=url, headers=headers).text
tree = etree.HTML(response)
img_lst = tree.xpath('//div[@class="text"]//img/@src')
for one_image in img_lst:
res = requests.get(url='http:'+one_image, headers=headers).content
with open('image/' + one_image.split('/')[-1] + '.gif', 'wb') as f:
f.write(res) if __name__ == '__main__':
main()

python爬虫数据解析之xpath的更多相关文章

  1. python爬虫--数据解析

    数据解析 什么是数据解析及作用 概念:就是将一组数据中的局部数据进行提取 作用:来实现聚焦爬虫 数据解析的通用原理 标签定位 取文本或者属性 正则解析 正则回顾 单字符: . : 除换行以外所有字符 ...

  2. python爬虫数据解析之BeautifulSoup

    BeautifulSoup是一个可以从HTML或者XML文件中提取数据的python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式. BeautfulSoup是python爬虫三 ...

  3. python爬虫数据解析的四种不同选择器Xpath,Beautiful Soup,pyquery,re

    这里主要是做一个关于数据爬取以后的数据解析功能的整合,方便查阅,以防混淆 主要讲到的技术有Xpath,BeautifulSoup,PyQuery,re(正则) 首先举出两个作示例的代码,方便后面举例 ...

  4. python爬虫数据解析之正则表达式

    爬虫的一般分为四步,第二个步骤就是对爬取的数据进行解析. python爬虫一般使用三种解析方式,一正则表达式,二xpath,三BeautifulSoup. 这篇博客主要记录下正则表达式的使用. 正则表 ...

  5. 070.Python聚焦爬虫数据解析

    一 聚焦爬虫数据解析 1.1 基本介绍 聚焦爬虫的编码流程 指定url 基于requests模块发起请求 获取响应对象中的数据 数据解析 进行持久化存储 如何实现数据解析 三种数据解析方式 正则表达式 ...

  6. python爬虫+数据可视化项目(关注、持续更新)

    python爬虫+数据可视化项目(一) 爬取目标:中国天气网(起始url:http://www.weather.com.cn/textFC/hb.shtml#) 爬取内容:全国实时温度最低的十个城市气 ...

  7. python 爬虫数据存入csv格式方法

    python 爬虫数据存入csv格式方法 命令存储方式:scrapy crawl ju -o ju.csv 第一种方法:with open("F:/book_top250.csv" ...

  8. Python爬虫教程-22-lxml-etree和xpath配合使用

    Python爬虫教程-22-lxml-etree和xpath配合使用 lxml:python 的HTML/XML的解析器 官网文档:https://lxml.de/ 使用前,需要安装安 lxml 包 ...

  9. python爬虫网页解析之lxml模块

    08.06自我总结 python爬虫网页解析之lxml模块 一.模块的安装 windows系统下的安装: 方法一:pip3 install lxml 方法二:下载对应系统版本的wheel文件:http ...

随机推荐

  1. 浅谈服务间通信【MQ在分布式系统中的使用场景】

    解决的问题 一项技术的产生必然是为了解决问题而生,了解了一项技术解决的问题,就能够很轻松的理解这项技术的设计根本,从而更好地理解与使用这项技术. 消息中间件和RPC从根本上来说都是为了解决分布式系统的 ...

  2. Hibernate中cascade作用

    Hibernate中cascade作用 只有“关系标记”才有cascade属性: 一个操作因级联cascade可能触发多个关联操作.前一个操作叫“主控操作”,后一个操作叫“关联操作”. cascade ...

  3. 【bzoj 3309 】 DZY Loves Math

    Description 对于正整数n,定义f(n)为n所含质因子的最大幂指数.例如f(1960)=f(2^3 * 5^1 * 7^2)=3, f(10007)=1, f(1)=0.给定正整数a,b,求 ...

  4. BZOJ_3747_[POI2015]Kinoman_线段树

    BZOJ_3747_[POI2015]Kinoman_线段树 Description 共有m部电影,编号为1~m,第i部电影的好看值为w[i]. 在n天之中(从1~n编号)每天会放映一部电影,第i天放 ...

  5. 【Canal源码分析】parser工作过程

    本文主要分析的部分是instance启动时,parser的一个启动和工作过程.主要关注的是AbstractEventParser的start()方法中的parseThread. 一.序列图 二.源码分 ...

  6. Spring py登陆模块(包含 记录登陆时间,记录ip,增加积分)

    嘛基于最近的复习准备写个关于spring登陆模块的小程序 虽然小但是五脏俱全呐 话不多说让我来介绍一下今天的登陆程序. 这些是 基于Spring JDBC 的持久层实现 基于Spring 声明事物的业 ...

  7. appium+python+eclipse简单编写小示例!

    Appium简单介绍! 一.appium分成3个部分来看,分别为:appium服务端.appium客户端.设备端 1.设备端 WebDriverAgentRunner 的应用,以后简称 WDA,这个应 ...

  8. 用python把一个txt文件中所有逗号,替换成空格?

    string = "word 2 3 4 5 6 7" string = ",".join(string.split()) import numpy as np ...

  9. python中字符串拆分与合并——split()、join()、strip()和replace()

    Python3 split()方法 描述split()通过指定分隔符对字符串进行切片,如果参数num 有指定值,则仅分隔 num 个子字符串 语法split()方法语法: str.split(str= ...

  10. gin框架使用注意事项

    gin框架使用注意事项 本文就说下这段时间我在使用gin框架过程中遇到的问题和要注意的事情. 错误处理请求返回要使用c.Abort,不要只是return 当在controller中进行错误处理的时候, ...