今天了解一下xpath提取信息的规则
先推荐一个在谷歌浏览器帮助做xpath语法分析的插件xpath-helper,具体教程和资源在网上有
下面开始了解一下xpath和lxml结合使用的基本操作
依旧以腾讯社招的html页面为例
<tbody><tr class="h">
<td class="l" width="374">职位名称</td>
<td>职位类别</td>
<td>人数</td>
<td>地点</td>
<td>发布时间</td>
</tr>
<tr class="even">
<td class="l square"><a target="_blank" href="position_detail.php?id=48398&keywords=&tid=87&lid=0">CSIG16-车联网架构师(深圳)</a></td>
<td>技术类</td>
<td>1</td>
<td>深圳</td>
<td>2019-03-11</td>
</tr>
<tr class="odd">
<td class="l square"><a target="_blank" href="position_detail.php?id=48393&keywords=&tid=87&lid=0">CSIG16-车联网系统工程师(自研基础产品运维负责人)(上海)</a></td>
<td>技术类</td>
<td>1</td>
<td>上海</td>
<td>2019-03-11</td>
</tr>
<tr class="even">
<td class="l square"><a target="_blank" href="position_detail.php?id=48394&keywords=&tid=87&lid=0">CSIG16-车联网IT运维经理(上海)</a></td>
<td>技术类</td>
<td>1</td>
<td>上海</td>
<td>2019-03-11</td>
</tr>
<tr class="odd">
<td class="l square"><a target="_blank" href="position_detail.php?id=48390&keywords=&tid=87&lid=0">CSIG17-云行业产品测试leader</a></td>
<td>技术类</td>
<td>1</td>
<td>深圳</td>
<td>2019-03-11</td>
</tr>
<tr class="even">
<td class="l square"><a target="_blank" href="position_detail.php?id=48392&keywords=&tid=87&lid=0">CSIG15-自然语言处理工程师(北京)</a></td>
<td>技术类</td>
<td>1</td>
<td>北京</td>
<td>2019-03-11</td>
</tr>
<tr class="odd">
<td class="l square"><a target="_blank" href="position_detail.php?id=48384&keywords=&tid=87&lid=0">15575-《王者荣耀》图形渲染开发工程师(成都)</a></td>
<td>技术类</td>
<td>2</td>
<td>成都</td>
<td>2019-03-11</td>
</tr>
<tr class="even">
<td class="l square"><a target="_blank" href="position_detail.php?id=48382&keywords=&tid=87&lid=0">25664-政务应用架构师(深圳)</a></td>
<td>技术类</td>
<td>3</td>
<td>深圳</td>
<td>2019-03-11</td>
</tr>
<tr class="odd">
<td class="l square"><a target="_blank" href="position_detail.php?id=48378&keywords=&tid=87&lid=0">22989-腾讯云容器技术高级工程师(北京)</a></td>
<td>技术类</td>
<td>1</td>
<td>北京</td>
<td>2019-03-11</td>
</tr>
<tr class="even">
<td class="l square"><a target="_blank" href="position_detail.php?id=48379&keywords=&tid=87&lid=0">22989-腾讯云-区域交付leader(北京)</a></td>
<td>技术类</td>
<td>1</td>
<td>北京</td>
<td>2019-03-11</td>
</tr>
<tr class="odd">
<td class="l square"><a target="_blank" href="position_detail.php?id=48380&keywords=&tid=87&lid=0">22989-腾讯云-区域交付leader(上海)</a></td>
<td>技术类</td>
<td>1</td>
<td>上海</td>
<td>2019-03-11</td>
</tr>
</tbody>
首先导入所需要的库
from lxml import etree
parser = etree.HTMLParser(encoding="utf-8")
html = etree.parse("tencent.html" , parser=parser)
导入etree时会飘红,并不影响使用,看着不舒服的同学可自行百度解决
一 :获取所有的tr标签
trs = html.xpath("//tr")
for tr in trs:
print(etree.tostring(tr , encoding="utf-8").decode("utf-8"))
"//"表示在整个页面中遍历,找到所有的tr标签,这里xpath语法返回的是一个列表类型
这里如果直接输出tr 我们将得到这样的运行结果
etree.tostring()的方法可以获得迭代器中的内容,为避免乱码,可以设置为“utf-8”并进行encode,获得标签,截取其中一个
二:获取第一个class为even的tr标签
tr = html.xpath("//tr[@class='even']")[0]
print(etree.tostring(tr , encoding="utf-8").decode("utf-8"))
首先获取class为even的tr标签[@class='even'],我们知道xpath返回的是列表,因此对其取下标0,就可以获取第一个
三:获取所有a标签的href属性
hrefs = html.xpath("//a/@href")
for href in hrefs:
print("https://hr.tencent.com/" + href)
现在获取的是各职位的详情的链接,当需要获取标签内的某个属性时,如@href即可获取
"/"表示遍历当前标签下的属性,这里是遍历a标签下的子属性
四:获取职位详情,纯文本
all_info = html.xpath("//tr[position()>1]")
poss = []
for info in all_info:
href = "https://hr.tencent.com/" + info.xpath(".//a/@href")[0]
name = info.xpath("./td[1]//text()")[0]
clas = info.xpath("./td[2]/text()")[0]
num = info.xpath("./td[3]/text()")[0]
adss = info.xpath("./td[4]/text()")[0]
date = info.xpath("./td[5]/text()")[0]
pos = {
"链接" : href,
"岗位" : name,
"类别" : clas,
"需求数量" : num,
"地址" : adss,
"发布日期" : date
}
poss.append(pos)
for pos in poss:
for k,v in pos.items():
print(k + " : " + v)
第一个tr标签明显是头信息,因此我们可以过滤,>1,即除第一个以外的所有tr标签,应该注意,xpath语法的下标从1开始且position是固定写法
所有的文本内容都在tr下的td标签,text()方法可以帮我们获取标签内的文本信息,截取部分