爬虫基础学习 - Xpath
1、xpath解析原理:
1.实例化一个etree对象,将需要被解析的页面源码加载到该对象中
2.调用etree对象中的xpath方法结合xpath解析式进行标签的定位和内容的获取
2、环境安装
pip install lxml
3、Element对象:
xml结构(包括html)文档的重要部分,表示文档中的标签元素,并且提供了一些方式来进行访问和操作这些元素1.元素名
2.元素属性
3.父子元素
4.文本内容
5.操作方法
4、etree.HTMLParser():
html解析器对象
remove_commnets(默认是false):移除html文档中的注释
remove_blank_text(默认是false):移除html文档中空白文本节点
recover(默认是false):尝试修复损坏的html文档
encoding(默认是None):指定html的编码方式//*(匹配所有的节点)
//li(匹配所有的li标签)通过/或者//查找子节点or子孙节点
//li/a (li标签内的a标签)子标签
获取所有的子孙节点//
5、匹配属性:
//element[@attribute='vlue']
//表示从文档的根开始搜索
element要选择元素的名称
@attribute 要删选的属性名称
value 要匹配的属性的值父节点:..来实现 或者 parent::
文本获取:text()
属性获取:
有些节点,有多个属性,有些属性多个值,多属性使用contains
6、xpath节点的运算符
= :判断两个值是否相等
!=:判断两个值不相等
< > >= <=
逻辑运算符
and or not
字符串运算符
concat():将多个字符串连接
starts-with():检查字符串是否以指定的前缀开头
contains():检查是否包含某个字符串
substring():从字符串截取子字符串
数字运算符:
+ - * / %按顺序选择
在标签中使用[]标识位置
last()最后一个
position()查询指定为位置的前几位
#! /usr/bin/env python3import html
from lxml import etree# //代表根目录, * 代表匹配全部节点
html_ = etree.parse('a.html', etree.HTMLParser())
result = html_.xpath('//*')
print(result)# 使用Xpath语法选取在li标签内的全部语法
result = html_.xpath('//li//a')
print(result)# //element[@attribute='vlue'] 匹配属性 匹配属性为 item-0 的 li 节点
result = html_.xpath("//li[@class='item-0']")
print(result)# 父节点的实现 ../ 或者 parent::/ //a[@href='link6.html']/../@class
result = html_.xpath("//a[@href='link6.html']/parent::*/@class")
print(result)# 读取 li 标签下的 文本属性 //li[@class='item-1']//text()
result = html_.xpath("//li[@class='item-1']/a/text()")
print(result)# 读取 a标签下的 href 链接属性
result = html_.xpath("//li/a/@href")
print(result)# 多属性使用contains, 包含根目录的属性
text = '''<li class="li item-0"><a href="link1.html">1-item</a></li><li class="li item-0" name="wangbo"><a href="link1.html">1-item</a></li><li class="li item-0"><a href="link1.html">2-item</a></li><li class="src item-1"><a href="link4.html">4-item</a></li><li class="item-1"><a href="link5.html">5-item</a></li><li class="item-0"><a href="link6.html">6-item</a></li>
'''
html_1 = etree.HTML(text)
result = html_1.xpath("//li[contains(@class,li)]/a/text()")
print(result)# 使用运算符
result = html_1.xpath("//li[contains(@class,li) and @name='wangbo']/a/text()")
print(result)# 按顺序进行查询 这里下标从 1 开始result = html_.xpath('//li[1]/a/text()')
print(result)
result = html_.xpath('//li[last()]/a/text()')
print(result)
result = html_.xpath('//li[position()<3]/a/text()')
print(result)
result = html_.xpath('//li[last() - 2]/a/text()')
print(result)