爬虫——XPath基本用法

第一章XML

一、xml简介

1.什么是XML?

1,XML指可扩展标记语言

2,XML是一种标记语言,类似于HTML

3,XML的设计宗旨是传输数据,而非显示数据

4,XML标签需要我们自己自定义

5,XML被设计为具有自我描述性

2.XML和HTML的区别?

1,XML被设计为传输和存储数据,其焦点是数据的内容

2,HTML是显示数据以及如何更好的显示数据

3.XML文档示例

<?xml version="1.0" encoding="utf-8"?>

<bookstore>
  <book category="cooking">
    <title lang="en">Everyday Italian</title>  
    <author>Giada De Laurentiis</author>  
    <year>2005</year>  
    <price>30.00</price>
  </book>  

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

  <book category="web">
    <title lang="en">XQuery Kick Start</title>  
    <author>James McGovern</author>  
    <author>Per Bothner</author>  
    <author>Kurt Cagle</author>  
    <author>James Linn</author>  
    <author>Vaidyanathan Nagarajan</author>  
    <year>2003</year>  
    <price>49.99</price>
  </book>

  <book category="web" cover="paperback">
    <title lang="en">Learning XML</title>  
    <author>Erik T. Ray</author>  
    <year>2003</year>  
    <price>39.95</price>
  </book>

</bookstore>

注意:这上面的标签都是自定义的

二、XML的节点关系

1.父(parent)

每个元素及属性都有一个父

下面这个XML例子中,book元是title,author,year,price元素的父

<?xml version="1.0" encoding="utf-8"?>

<book>
  <title>Harry Potter</title>
  <author>J K. Rowling</author>
  <year>2005</year>
  <price>29.99</price>
</book>

2.子(children)

元素节点可能有零个,一个或者多个子

在下面的例子中 title,author,year,price都是book元素的子

<?xml version="1.0" encoding="utf-8"?>

<book>
  <title>Harry Potter</title>
  <author>J K. Rowling</author>
  <year>2005</year>
  <price>29.99</price>
</book>

3.同胞(sibling)

拥有相同的父的节点

在下面例子中 title,author,year,price元素都是同胞

<?xml version="1.0" encoding="utf-8"?>

<book>
  <title>Harry Potter</title>
  <author>J K. Rowling</author>
  <year>2005</year>
  <price>29.99</price>
</book>

4.先辈(ancestor)

某节点的父,父的父,等等

下面例子中,title元素的先辈是book和bookstore

<?xml version="1.0" encoding="utf-8"?>

<bookstore>

    <book>
      <title>Harry Potter</title>
      <author>J K. Rowling</author>
      <year>2005</year>
      <price>29.99</price>
    </book>

</bookstore>

5.后代

某节点的子,子的子,等等

下面例子中,bookstore后代是book,title,author,year,price元素

<?xml version="1.0" encoding="utf-8"?>
<bookstore>
<book>
  <title>Harry Potter</title>
  <author>J K. Rowling</author>
  <year>2005</year>
  <price>29.99</price>
</book>
</bookstore>

第二章 xpath

XPath原理:先将HTML文档转为XML文档,再用XPath查找HTML节点或元素

一、xpath简介

xpth解析

(1)本地文件                                                                                           etree.parse

(2)服务器响应的数据                  response.read().decode('utf-8')          etree.HTML()

示例1:

1.本地文件解析

解析_xpath的基本使用.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8"/>
    <title>Title</title>
</head>
<body>
  <ul>
    <li id="l1" class="c1">北京</li>
    <li id="l2">上海</li>
    <li class="c3">深圳</li>
    <li id="c3">武汉</li>
    <li id="c4">广州</li>
  </ul>
  <ul>
    <li>大连</li>
    <li>锦州</li>
    <li>沈阳</li>
  </ul>
</body>
</html>
#解析'解析——xpath的基本使用.html‘本地文件
tree=etree.parse('解析_xpath的基本使用.html')
print(tree)#<lxml.etree._ElementTree object at 0x000001FC65813F88>

1fb688f4348348728c93c517a07ec886.png

二、节点选取

1.选取节点

XPath使用路径表达式来选取XML文档中的节点或者节点集,这些路径表达式和我们在常规的电脑文件系统里看到的表达式非常相似。

最常用的路径表达式:

表达式描述
nodename选取此节点的所有子节点。
/从根节点选取。
//从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。
.选取当前节点。
..选取当前节点的父节点。
@选取属性。

例如:

bookstore选取 bookstore 元素的所有子节点。 
bookstore/book选取属于 bookstore 的子元素的所有 book 元素。 
//book选取所有 book 子元素,而不管它们在文档中的位置。 
bookstore//book选择属于 bookstore 元素的后代的所有 book 元素,而不管它们位于 bookstore 之下的什么位置。 
//@lang选取名为 lang 的所有属性。 

2.选取未知节点

通配符描述
*匹配任何元素节点。
@*匹配任何属性节点。
node()匹配任何类型的节点。

比如:

路径表达式结果
/bookstore/*选取 bookstore 元素的所有子元素。
//*选取文档中的所有元素。
html/node()/meta/@*选择html下面任意节点下的meta节点的所有属性
//title[@*]选取所有带有属性的 title 元素。

 3.选取若干路径

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

比如: 

路径表达式结果
//book/title | //book/price选取 book 元素的所有 title 和 price 元素。
//title | //price选取文档中的所有 title 和 price 元素。
/bookstore/book/title | //price选取属于 bookstore 元素的 book 元素的所有 title 元素,以及文档中所有的 price 元素。

三、路径查询

tree.xpath('xpath路径')
1         //:查找所有的子孙节点,不考虑层级关系
2         /:找直接子节点

1.查找ul下面的li

li_list=tree.xpath('//body/ul/li')
# #判断列表的长度
print(li_list)
print(len(li_list))

82450bb404f0454ab6cdaaefee1f0d4a.png

2.谓词查询

如:

//div[@id]

//div[@id='属性值']

#查找所有有id属性的li标签
#text()获取标签中的内容
li_list=tree.xpath('//ul/li[@id]')
li_list1=tree.xpath('//ul/li[@id]/text()')#['北京', '上海']
#查找id=l1的li标签   注意引号问题
li_list2=tree.xpath('//ul/li[@id="l1"]/text()')
print(li_list)
print(li_list1)
print(li_list2)

0195153f941145e19a14fc8092654337.png

3.属性查询

如://@class

#查找id为l1的li标签的class的属性值
li_list=tree.xpath('//ul/li[@id="l1"]/@class')#c1
print(li_list)

f77f34240544459182cc0a65d4b6633a.png

4.模糊查询

如:

//div[contains(@id,"he")]

//div[starts-with(@id,"he")]

#查找id中包含l的li标签
li_list=tree.xpath('//ul/li[contains(@id,"l")]/text()')#['北京', '上海']
print(li_list)

557a7800c7664408b30da09e95e67513.png

5.内容查询

如://div/h1/text()

#查询id的值以c开头的标签
li_list=tree.xpath('//ul/li[starts-with(@id,"c")]/text()')#['武汉', '广州']
print(li_list)

45e06e5815c446cd817af8d44a0f291c.png

6.逻辑运算

如:

//div[@id="head" and @class="s_down"]

//title|//price

#查询id为l1和class为c1的标签
li_list=tree.xpath('//ul/li[@id="l1" and @class="c1"]/text()')#['北京']
li_list1=tree.xpath('//ul/li[@id="l1"]/text() | //ul/li[@id="l2"]/text()')#['北京', '上海']
print(li_list)
print(len(li_list))
print(li_list1)
print(len(li_list1))

75421d60c5144a6e988f9715c95a9c4e.png

四、代码示例

html = '''
<div>
    <ul>
         <li class="item-0"><a href="link1.html">first item</a></li>
         <li class="item-1"><a href="link2.html">second item</a></li>
         <li class="item-inactive"><a href="link3.html">third item</a></li>
         <li class="item-1"><a href="link4.html">fourth item</a></li>
         <li class="item-0"><a href="link5.html">fifth item</a>
 </div>
'''

# 1,使用lxml的etree类
from lxml import etree

#,2,利用etree.HTML()构造一个xpath解析对象(转为xml文档)
xml_doc=etree.HTML(html)
print(xml_doc)
print('-----'*10)

# etree.tostring()输出转换后的html代码,
html_doc = etree.tostring(xml_doc)
print(html_doc) #自动补全了body,html标签
print(type(html_doc)) # bytes类型
# print('-----'*10)
print(html_doc.decode())  # 利用decode()方法将其转成str类型,
print(type(html_doc.decode()))

4ac08a62f3f9410ebf5880d5bf639362.png

注意:

1,只要涉及到条件,加 []

2,只要获取属性值,加 @

3,通过text()取内容

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/888463.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

java8 双冒号(::)使用方法

双冒号&#xff08;::&#xff09;运算符是跟函数式接口相关的运算符&#xff0c;作为函数式接口的赋值操作。 双冒号用于静态方法 使用方法&#xff1a;将类的静态方法赋值给一个函数式接口&#xff0c;静态方法的参数个数、类型要跟函数式的接口一致。调用这个函数式接口就…

VMware中Ubuntu系统Docker正常运行但网络不通(已解决)

问题描述&#xff1a;在VMware中的Ubuntu系统下部署了Docker&#xff0c;当在docker容器中运行Eureka微服务时&#xff0c;发现Eureka启动正常&#xff0c;但无法通过网页访问该容器中Eureka。 解决办法如下&#xff1a; 1、创建桥接网络&#xff1a;test-net sudo docker n…

ES postman操作全量修改,局部修改,删除

全量修改 修改需要调用的url 地址是http://192.168.1.108:9200/shopping/_doc/1001&#xff0c;调用方法使用put 只修改指定的需求的内容的请求方式 post方式就是局部修改 http://192.168.1.108:9200/shopping/_update/1001&#xff0c;请求方式post 上图是只修改id 为1001数…

【C++】map详解

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &#x1f4e2;本文由 JohnKi 原创&#xff0c;首发于 CSDN&#x1f649; &#x1f4e2;未来很长&#…

APP自动化搭建与应用

APP自动化环境搭建 用于做APP端UI自动化&#xff0c;adb连接手机设备。 需要的工具java编辑器&#xff1a;jdk、Android-sdk软件开发工具组、appium的python客户端、nodes.js、夜神模拟器、apk包、uiautomatorviewer 第一步&#xff1a;安装sdk&#xff0c;里面包含建立工具bu…

Spring Boot中线程池使用

说明&#xff1a;在一些场景&#xff0c;如导入数据&#xff0c;批量插入数据库&#xff0c;使用常规方法&#xff0c;需要等待较长时间&#xff0c;而使用线程池可以提高效率。本文介绍如何在Spring Boot中使用线程池来批量插入数据。 搭建环境 首先&#xff0c;创建一个Spr…

docker compose入门5—创建一个3副本的应用

1. 定义服务 version: 3.8 services:web:image: gindemo:v2deploy:replicas: 3ports:- "9090" 2. 启动服务 docker compose -f docker-compose.yml up -d 3. 查看服务 docker compose ps 4. 访问服务

LeetCode讲解篇之852. 山脉数组的峰顶索引

文章目录 题目描述题解思路题解代码题目链接 题目描述 题解思路 我们可以采用二分查找&#xff0c;每次查询区间中点元素与中点下一个元素比较 如果中点元素大于其下一个元素&#xff0c;则表示从中点开始向右是递减趋势&#xff0c;那峰值索引一定小于等于中点&#xff0c;我…

留存率的定义与SQL实现

1.什么是留存率 留存率是指在特定时间段内&#xff0c;仍然继续使用某项产品或服务的用户占用户总数的百分比。 通常&#xff0c;留存率会以日&#xff0c;周&#xff0c;或月为单位进行统计和分析。 2.SQL留存率常见问题 1.计算新用户登录的日期的次日留存率以及3日留存率 …

如何实现 C/C++ 与 Python 的通信?

在现代编程中&#xff0c;C/C与Python的通信已经成为一种趋势&#xff0c;尤其是在需要高性能和灵活性的场景中。本文将深入探讨如何实现这两者之间的互通&#xff0c;包括基础和高级方法&#xff0c;帮助大家在混合编程中游刃有余。 C/C 调用 Python&#xff08;基础篇&#…

生成正激波表的代码

k1.4 import math import numpy as np import pandas as pd #Ma1到p之比 def Ma2p(Ma1,k):return 2*k*Ma1**2/(k1)-(k-1)/(k1) def Ma2rho(Ma1,k):return (k1)*Ma1**2/(2(k-1)*Ma1**2) def Ma2T(Ma1,k):return 1/Ma1**2*(2/(k1))**2*(k*Ma1**2-(k-1)/2)*(1(k-1)/2*Ma1**2) def…

国外电商系统开发-运维系统文件上传

文件上传&#xff0c;是指您把您当前的PC电脑上的文件批量的上传到远程服务器上&#xff0c;在这里&#xff0c;您可以很轻松的通过拖动方式上传&#xff0c;只需要动动鼠标就搞定。 第一步&#xff0c;您应该选择要上传的服务器&#xff1a; 选择好了以后&#xff0c;点击【确…

小程序-全局数据共享

目录 1.什么是全局数据共享 2. 小程序中的全局数据共享方案 MboX 1. 安装 MobX 相关的包 2. 创建 MobX 的 Store 实例 3. 将 Store 中的成员绑定到页面中 4. 在页面上使用 Store 中的成员 5. 将 Store 中的成员绑定到组件中 6. 在组件中使用 Store 中的成员 1.什么是全…

谷歌发布了日语版的 Gemma2 模型——gemma-2-2b-jpn-it

Gemma 是一系列同类最佳的开放式模型&#xff0c;其灵感和技术源自 Gemini 系列模型。 它们是具有开放权重的文本到文本、纯解码器大型语言模型。 Gemma 模型非常适合各种文本生成任务&#xff0c;包括问题解答、摘要和推理。 Gemma-2-JPN 是一个针对日语文本进行微调的 Gemma…

使用微服务Spring Cloud集成Kafka实现异步通信

在微服务架构中&#xff0c;使用Spring Cloud集成Apache Kafka来实现异步通信是一种常见且高效的做法。Kafka作为一个分布式流处理平台&#xff0c;能够处理高吞吐量的数据&#xff0c;非常适合用于微服务之间的消息传递。 微服务之间的通信方式包括同步通信和异步通信。 1&a…

【CTF Web】Pikachu CSRF(get) Writeup(CSRF+GET请求+社会工程学)

CSRF(跨站请求伪造)概述 Cross-site request forgery 简称为“CSRF”&#xff0c;在CSRF的攻击场景中攻击者会伪造一个请求&#xff08;这个请求一般是一个链接&#xff09;&#xff0c;然后欺骗目标用户进行点击&#xff0c;用户一旦点击了这个请求&#xff0c;整个攻击就完成…

vmstat命令:系统性能监控

一、命令简介 ​vmstat​ 是一种在类 Unix 系统上常用的性能监控工具&#xff0c;它可以报告虚拟内存统计信息&#xff0c;包括进程、内存、分页、块 IO、陷阱&#xff08;中断&#xff09;和 CPU 活动等。 ‍ 二、命令参数 2.1 命令格式 vmstat [选项] [ 延迟 [次数] ]2…

docker快速上手

一个轻量的虚拟机&#xff0c;让程序员不再纠结于环境部署&#xff0c;更多集中于代码编写&#xff0c;基础建设&#xff0c;开发 作用&#xff1a; 打包&#xff1a;把你软件运行所需的所有东西打包到一起 分发&#xff1a;把你打包好的“安装包”上传到一个镜像仓库&#…

渲染技术的教育普及,塑造未来视觉艺术与技术的璀璨星辰

在数字时代的浪潮中&#xff0c;渲染技术作为连接创意与现实的桥梁&#xff0c;正以前所未有的速度推动着视觉艺术与技术领域的融合与发展。从电影特效的震撼呈现到游戏世界的细腻构建&#xff0c;从广告设计的视觉冲击力到建筑设计方案的直观展示&#xff0c;渲染技术无处不在…

css 简单网页布局——浮动(一)

1. 三种布局方式 1.1 标准流 1.2 浮动的使用 1.3 简述浮动 1.3.1 浮动三大特性 <style>.out {border: 1px red solid;width: 1000px;height: 500px;}.one {background-color: aquamarine;width: 200px;height: 100px;}.two {background-color: blueviolet;width: 200px;h…