python 爬虫(XPATH使用)

python 爬虫(XPATH使用)

XPATH简介:

Xpath(XML PAth Language)是一门在XML文档中查找信息的语言,可用来在XML文档中对元素和属性进行遍历。
	W3School官方文档: https://www.w3school.com.cn/xpath/index.asp

下载LXML

pip install lxml
pip install lxml -i https://pypi.tuna.tsinghua.edu.cn/simple
如果出现网络延迟,可使用清华源进行安装

一、使用

1、导入LXML

导入两种导入方式

第一种:直接导入
from lxml import etree

注意:此种导入方式,可能会报错(etree下面会出现红色波浪线,不影响正常使用)

第二种:正规军
 from lxml import html
 etree = html.etree

2、基本使用

1、etree.HTML() 将字符串转换成HTML元素对象,可以自动添加缺失的元素
html = etree.HTML(str)   # <Element html at 0x2179d48>

print(html)  # <Element html at 0x39dec88>

2. tostring()方法:

2.1 tostring() 查看转换之后的内容(二进制类型)

如果想要查看字符串类型,需要解码
如果想要显示汉字,需要先编码,再解码

content = etree.tostring(html,encoding='utf-8')
print(content.decode())
2.2 xpath()方法 作用:提取页面数据,返回值是一个列表

xpath的使用一定是建立在etree.HTML()之后的内容中的

xpath是如何来提取页面数据的?
答:使用的是路径表达式
windows:D:\19课堂\offcn_live\xxxx.exe
2.2.1 xpath路径分为两种:

第一种:/ 代表一层层的查找,如果/存在于开头,代表根路径

例如:查找bookstore标签
bookstore = html.xpath('/html/body/bookstore')
print(bookstore)  # [<Element bookstore at 0x39d5d48>]

第二种:// 任意路径 焦点在元素身上

例如:查找bookstore标签
bookstore = html.xpath('//bookstore')
print(bookstore)  # [<Element bookstore at 0x39d5d88>]

第一种和第二种结合

例如:查找所有book标签
book = html.xpath('//bookstore/book')
print(book)  # [<Element book at 0x39d5d48>, <Element book at 0x39d5c48>, <Element book at 0x39d5d88>, <Element book at 0x39d5dc8>, <Element book at 0x39d5e08>]
2.2.2 /text() 获取标签之间的内容
例如:获取所有title标签的内容
步骤:
1. 找到所有title标签
2. 获取内容
title = html.xpath('//book/title/text()')
print(title)  # ['Harry Potter', 'Learning XML', '西游记', '水浒传', '三国演义']

2.3 谓语 使用[] 可以理解成条件

2.3.1 [n] 代表获取第n个元素,n是数字,n>=1
例如:获取第二个title标签
title = html.xpath('//book[2]/title/text()')
print(title)  # ['Learning XML']

last() 获取最后一个
同理:last()-1 获取倒数第二个

例如:获取最后一本书的title标签之间的内容
title = html.xpath('//book[last()]/title/text()')
print(title)  # ['三国演义']
2.3.2 position() 位置,范围 支持 > / < / = / >= / <= / !=

例如:获取最后两本书的title标签之间的内容
步骤:

  1. 先获取后两本书
  2. 获取内容
title = html.xpath('//book[position()>3]/title/text()')
title = html.xpath('//book[position()>last()-2]/title/text()')
print(title)  # ['水浒传', '三国演义']
2.3.3 获取属性值:@属性名

例如:获取lang属性值为cng的title标签的内容

title = html.xpath('//book/title[@lang="cng"]/text()')
print(title)   # ['西游记']

例如:获取包含src属性的title标签的内容

title = html.xpath('//book/title[@src]/text()')
print(title)

例如:获取包含属性的title标签的内容

title = html.xpath('//book/title[@*]/text()')
print(title)  # ['Harry Potter', 'Learning XML', '西游记', '水浒传', '三国演义']

例如:获取最后一个title标签的src属性的值

title = html.xpath('//book[last()]/title/@src')
print(title)   # ['https://www.jd.com']

例如:获取所有包含src属性的标签之间的内容

node = html.xpath('//*[@src]/text()')
print(node)  # ['Harry Potter', '水浒传', '三国演义']

2.4 and 与 连接的是谓语(条件)

例如:获取lang="dng"并且class="t1"的title标签的内容

title = html.xpath('//book/title[@lang="dng" and @class="t1"]/text()')
title = html.xpath('//book/title[@lang="dng"][@class="t1"]/text()')
print(title)  # ['三国演义']
2.5 or 或 连接谓语

例如:查找lang="cng"或者lang="bng"的title标签的内容

title = html.xpath('//book/title[@lang="cng" or @lang="bng"]/text()')
print(title)
2.6 | 连接路径

例如:获取所有title标签和price标签之间的内容

title_price = html.xpath('//title/text() | //price/text()')
print(title_price) # ['Harry Potter', '29.99', 'Learning XML', '39.95', '西游记', '69.95', '水浒传', '29.95', '三国演义', '29.95']
2.7 parse() 作用:从文件中读取数据

注意:读取的文件,必须满足xml格式(不存在单标签,全部都是双标签)

content = etree.parse('Node.html')
print(content)  # <lxml.etree._ElementTree object at 0x00000000039D5D48>
res = etree.tostring(content)
print(res)
已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 创作都市 设计师:CSDN官方博客 返回首页