python3爬虫学习之数据提取之lxml与xpath

今天了解一下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&amp;keywords=&amp;tid=87&amp;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&amp;keywords=&amp;tid=87&amp;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&amp;keywords=&amp;tid=87&amp;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&amp;keywords=&amp;tid=87&amp;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&amp;keywords=&amp;tid=87&amp;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&amp;keywords=&amp;tid=87&amp;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&amp;keywords=&amp;tid=87&amp;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&amp;keywords=&amp;tid=87&amp;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&amp;keywords=&amp;tid=87&amp;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&amp;keywords=&amp;tid=87&amp;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()方法可以帮我们获取标签内的文本信息,截取部分

猜你喜欢

转载自blog.csdn.net/s_kangkang_A/article/details/89005212