python爬虫数据解析之xpath

摘要:
Xpath是一种用于在xml文档中查找信息的语言。在xpath中,有7种类型的节点、元素、属性、文本、命名空间、处理指令、注释和根节点书店˃哈里波特JK。罗琳200529.99上述节点示例:JK罗琳lang=“en”父级:在上述示例中,book是标题、作者、年份和价格的父级。XPath使用路径表达式选择XML文档中的节点。

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 来选取的。

python爬虫数据解析之xpath第1张

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

python爬虫数据解析之xpath第2张

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

比如:

python爬虫数据解析之xpath第3张

选取未知节点:

 python爬虫数据解析之xpath第4张

比如:

python爬虫数据解析之xpath第5张

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

python爬虫数据解析之xpath第6张

常用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》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇【C#】使用OWIN创建Web API发红包随机金额的两种方式下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

reuqest模块及UA反扒机制

requests模块 爬虫中一个基于网络请求的模块 pip install requests 作用:模拟浏览器发起请求 编码流程: 1 . 指定url 2 . 发起请求 3 . 获取响应数据(爬取到的页面源码数据) 4 . 进行持久化存储 简单例子: #指定爬取的url (以搜狗为例) url = "https://www.sogou.com"...

PYMOTW: CONFIGPARSER

感谢PyMOTW中文翻译小组,这是一个很棒的技术文摘,类似于cookbook。  模块: ConfigParser 目的: 读取/写入配置文件,类似于Windows的INI文件 python版本: 1.5+ 1.1 描述       ConfigParser模块可以为你的应用程序创建用户可编辑的配置文件. 这个配置文件由一个个节组成,每个节可以包含配置数...

Apache Shiro(六)-基于URL配置权限

数据库 先准备数据库啦。 1 DROP DATABASE IF EXISTS shiro; 2 CREATE DATABASE shiro DEFAULT CHARACTER SET utf8; 3 USE shiro; 4 5 drop table if exists user; 6 drop table if exis...

Python自带xml模块实现xpath查询带xmlns命名空间的xml

需求 手上有个项目需要解析xml数据,参考写爬虫的经验,容易想到使用XPath语句进行节点导航。 XPath 是一门在 XML 文档中查找信息的语言,用于在 XML 文档中通过元素和属性进行导航。 XPath 使用路径表达式来选取 XML 文档中的节点或者节点集。这些路径表达式和我们在常规的电脑文件系统中看到的表达式非常相似。 查阅 网上搜了一下,大多推荐...

百度地图在前端开发中的运用

一、安装及引入 1、在vue中安装依赖 $ npm install vue-baidu-map --save 在vue脚手架main.js中引入 import BaiduMap from 'vue-baidu-map' Vue.use(BaiduMap, { ak: 'Yo8oGhNGslHc4B8Qs8EWI4BvU3Qt4Zla' }); ...

Python笔记---错误笔记

Python---错误笔记 1. Python编码问题: 我们在编写 Python 脚本时,往往会写上中文凝视。可是有时候,当我们执行程序时。却发现例如以下错误:SyntaxError: Non-ASCII character 'xe5' in file /home/johnnie/Files/Workspace/python/head_first/ch...