Python爬虫学习之第七天---数据提取-lxml模块和Xpath使用

本文详细讲解了如何利用lxml模块结合XPath语法在HTML和XML文档中定位元素,提取属性和文本,以及安装和使用XPathHelper插件。通过实例演示,学习者能快速上手数据抓取和解析技巧。

爬虫学习之第七天—数据提取-lxml模块和Xpath使用

知识点:
	了解 lxml模块和xpath语法的关系
	了解 lxml模块的使用场景
	了解 lxml模块的安装
	了解 谷歌浏览器xpath helper插件的安装和使用
	掌握 xpath语法-基础节点选择语法
	掌握 xpath语法-节点修饰语法
	掌握 xpath语法-其他常用语法
	掌握 lxml模块中使用xpath语法定位元素提取属性值或文本内容
	掌握 lxml模块中etree.tostring函数的使用

一、 了解 lxml模块和xpath语法

lxml模块可以利用XPath规则语法,来快速的定位HTML\XML 文档中特定元素以及获取节点信息(文本内容、属性值)
XPath (XML Path Language) 是一门在 HTML\XML 文档中查找信息的语言,可用来在 HTML\XML 文档中对元素和属性进行遍历。
W3School官方文档:http://www.w3school.com.cn/xpath/index.asp
提取xml、html中的数据需要lxml模块和xpath语法配合使用

二、 谷歌浏览器xpath helper插件的安装和使用

要想利用lxml模块提取数据,需要我们掌握xpath语法规则。接下来我们就来了解一下xpath helper插件,它可以帮助我们练习xpath语法。

1、xpath helper插件的安装

1.1、下载Chrome插件 XPath Helper
可以在chrome应用商城进行下载,如果无法下载,也可以从下面的链接进行下载
下载地址:链接:https://pan.baidu.com/s/10Nb2pqfgkhTuHJ4FnQ3Hrg 提取码:44ew 
1.2、将下载好的xpath文件(请选着好mac或win版本的.crx文件)拖入谷歌浏览器。

在这里插入图片描述
在这里插入图片描述

点击插件后即可显示上面的界面。

在这里插入图片描述

1.3、如果是linux或macOS操作系统,直接将crx文件拖入已经开启开发者模式的chrome浏览器扩展程序界面

三、Xpath使用

1、XPath简介

XPath 是一门在 XML 文档中查找信息的语言。XPath 用于在 XML 文档中通过元素和属性进行导航。
什么是XPath:	
    XPath 使用路径表达式在 XML 文档中进行导航
    XPath 包含一个标准函数库
    XPath 是 XSLT 中的主要元素
    XPath 是一个 W3C 标准

2、XPath节点

在 XPath 中,有七种类型的节点:元素、属性、文本、命名空间、处理指令、注释以及文档节点(或称为根节点)。
节点(Node)
在 XPath 中,有七种类型的节点:元素、属性、文本、命名空间、处理指令、注释以及文档(根)节点。XML 文档是被作为节点树来对待的。树的根被称为文档节点或者根节点。
示例说明:
请看下面这个 XML 文档:
<?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>
上面的XML文档中的节点例子:

<bookstore> (文档节点)
<author>J K. Rowling</author> (元素节点)
lang="en" (属性节点) 
J K. Rowling (基本值(或称原子值,Atomic value),基本值是无父或无子的节点。)
"en"  (基本值(或称原子值,Atomic value),基本值是无父或无子的节点。)
节点关系

在这里插入图片描述

author是title的第一个兄弟节点

3、XPath语法

XPath语法基本分为四类:层级、属性、函数、运算符
以下语法均通过58同城租房网做演示实例

在这里插入图片描述

语法类别表达式描述示例
层级/从根节点选取、或者是元素和元素间的过渡。/html/body/div[6]/div[2] : 获取此div中所有列表中的信息
层级//从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。//div[@class=“list-box”]: 获取div中class=“list-box”的所有内容
层级.选取当前节点。
层级选取当前节点的父节点。
层级parent选取当前节点的父节点//ul[@class=“house-list”]/li[1]/parent::div : 选取ul的所有信息(li的父节点)
层级child选取当前节点的所有子节点//ul[@class=“house-list”]/li[1]/child::div[2]: 获取li列表中子节点div2的信息
层级preceding选取当前节点的开始标签之前的所有节点
层级following选取当前节点的结束标签之后的所有节点//ul[@class=“house-list”]/li[1]/following::text()
层级ancestor选取当前节点的所有先辈节点 (父、祖父等)//ul[@class=“house-list”]/li[1]/ancestor::div
层级descendant-or-self选取当前节点的所有后代节点及当前节点本身//ul[@class=“house-list”]/li[1]/descendant-or-self::div[2]
层级descendant选取当前节点的所有后代节点 (子、孙等)//ul[@class=“house-list”]/li[1]/descendant::h2 : 选取li的孙节点h2
属性@选取属性
属性@*选取所有属性//ul[@class=“house-list”]//div[@class=“des”]//a/@*
属性[@attrib]选取具有给定属性的所有元素//ul[@class=“house-list”]//div[@class=“des”]//a/@href
属性[@attrib=‘value’]选取给定属性具有给定值的所有元素//ul[@class=“house-list”]
函数last()返回被处理节点的最后一个元素//div[@id=“s-top-left”]/a[last()]
函数position()匹配返回节点的索引位置//div[@id=“s-top-left”]/a[position()=1]
函数contains()匹配一个属性值中包含的字符串,用于模糊定位//div[contains(@id,“s-t”)]/a[last()]
函数text()文本定位,常和contains()函数一起使用//div/a[contains(text(),“学”)]
函数starts-with()匹配一个属性值开始位置的关键字,用于模糊定位//div[starts-with(@id,“s-t”)]/a[last()]
运算符=等于
运算符!=不等于
运算符<小于
运算符>大于
运算符<=小于等于
运算符>=大于等于
运算符or
运算符and
运算符*通配符,匹配任意字符,如//div/*,选取div标签下的所有标签
运算符与或符,双方条件都满足时都显示,否则只显示满足条件的一方
运算符[]谓语和索引需要用[]括起来,谓语是用来查找某个特定节点或包含指定值的节点

四、Lxml模块

1、安装模块

pip/pip3 install lxml
或:python/python3 -m pip/pip3 install lxml

2、lxml使用

导入lxml 的 etree 库
	from lxml import etree
	
利用etree.HTML,将html字符串(bytes类型或str类型)转化为Element对象,Element对象具有xpath的方法,返回结果的列表
	html = etree.HTML(text) 
	ret_list = html.xpath("xpath语法规则字符串")
	
xpath方法返回列表的三种情况
	返回空列表:根据xpath语法规则字符串,没有定位到任何元素
	返回由字符串构成的列表:xpath字符串规则匹配的一定是文本内容或某属性的值
	返回由Element对象构成的列表:xpath规则字符串匹配的是标签,列表中的Element对象可以继续进行xpath

3、lxml模块实例

from lxml import etree
text = ''' 
<div> 
  <ul> 
    <li class="item-1">
      <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>
  </ul> 
</div>
'''

html = etree.HTML(text)

#获取href的列表和title的列表
href_list = html.xpath("//li[@class='item-1']/a/@href")
title_list = html.xpath("//li[@class='item-1']/a/text()")

#组装成字典
# for href in href_list:    方法1
#     item = {}
#     item["href"] = href
#     item["title"] = title_list[href_list.index(href)]
#     print(item)

for text,link in zip(title_list,href_list):    # 方法2
    print(text,link)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lufei0920

你的鼓励将是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值