#2.数据提取
#XPath语法和 lxml模块
Xpath是一门在XML和HTML文档中查找信息的语言
原本设计适用于XML的,但XML和HTML两者的语法极为相似,所以也可以使用HTML
谷歌浏览器下是XPATH
火狐浏览器下是TRY XPATH
360浏览器下也兼容XPATH,使用时需要打开开发者模式
#XPATH语法
name 选取name下所有子节点
/ 指定路径,获取子节点
// 所有路径,获取子孙节点
@ 选取节点属性
谓词 放在[]中的内容,用于查找某个特定值的节点
例如:
div[1] 第一个子元素
div[last()] 最后一个子元素
div[position() < 3] 选取节点顺序小于3三的节点,也就是前两个节点
//div[@price] 因为属性没有设置返回,所以是选取所有拥有price属性的节点
//div[@price=10] 选取所有price属性等于10的div节点
通配符
- 匹配任意节点
@* 匹配节点中的任意属性
运算符
| 可以选取多个路径 /a | //b 返回a路径和所有b路径下的节点集
-
-
- div 加减乘除
= != < <= > >= 条件运算符
or and mod 逻辑运算符
- div 加减乘除
-
注意谓词下标是从1开始的。
#lxml库
lxml和正则一样,也是用C语言实现的,是一款HTML/XML解析器,可以通过之前的XPath语法,来快速定位特定元素以及节点信息
安装 pip install lxml
官方文档:http://lxml.de/index.html
安装,注意,我的版本是3.8,所以下载3.8的版本 pip3.8 install lxml
from lxml import etree
text = """
<p class="text">周深惊艳了青春的时光<br>深深却温柔了我的岁月<br>――来自一个生米入坑的感言</p>
"""
#将字符串转换成一个Element对象,可以窒息感XPATH语法,此时不是HTML文本
html = etree.HTML(text)
#打印数据类型,可以查看
print(type(html))
print(etree.tostring(html, encoding = 'utf-8').decode('utf-8'))
字符集:为每一个「字符」分配一个唯一的 ID(学名为码位 / 码点 / Code Point)
编码规则:将「码位」转换为字节序列的规则(编码/解码 可以理解为 加密/解密 的过程)
utf-8是一个编码规则,unicode是字符集,注意不要混淆
直接tostring后发现乱码,设定以utf-8规则解析成byte类型,然后decode成unicode字符串类型,这里不指定使用的也是utf-8规则,但一般还是为了规范进行指定
打印出来的时候,发现将HTML文本进行了规范化
#解析html文件
etree.parse(’.html’)
//将文件转换成element对象,但默认是以xml解析器,如果遇到不规范的html代码,就会出错,此时需要指定为HTML解析器
parser = etree.HTMLParse(encoding = ‘utf-8’)
etree.parse(’.html’, parser = parser)
//如果要指定转换类型,则需使用指定解析器
from lxml import etree
parser = etree.HTMLParser(encoding = 'utf-8')
html = etree.parse("123.html", parser = parser)
trs = html.xpath("//div [@class = 'recruit-list']")
for tr in trs:
ZW = tr.xpath("./a/h4/text()")[0]
DJ = tr.xpath("./a/p[1]/span[1]/text()")[0]
WZ = tr.xpath("./a/p[1]/span[2]/text()")[0]
LX = tr.xpath("./a/p[1]/span[3]/text()")[0]
SJ = tr.xpath("./a/p[1]/span[4]/text()")[0]
XQ = tr.xpath("./a/p[2]/text()")[0]
ID = tr.xpath(".//div/div[3]/@id")[0]
url = "https://careers.tencent.com/jobdesc.html?postId=" + ID
GW = {
'链接' : url,
'职位' : ZW,
'等级' : DJ,
'工作地点' : WZ,
'工作类型' : LX,
'发布时间' : SJ,
'详情' : XQ
}
print(GW)
爬取腾讯招聘网页的实例
注意 /@id 是获取id这个属性的值
xpath 返回的是一个列表
. 表示从当前目录下继续查找,否则将会从源目录下开始查找