雪重 Python Developer 知识 汗水 灵感 机遇
2022年3月2日   spider

别再问xpath定位不到

新手可能遇到的问题,在浏览器上使用插件xpath helper能够定位提取数据,为什么使用python中的xpath方法怎么也定位不到?本文列举一下可能的几种情况,怎么说呢,这种问题自己随便百度一下就能找到答案。em,有些同学以后就不用再问了。。。

1.js惹的祸

示例网址:https://paker.net.cn/anti/xpath

image-20220302140451524

在 div class="page box"里,使用xpath helper插件看一下,//div[@class='page box']正确定位高亮了

image-20220302140620132

用python请求并解析看看,结果是输出为空,没有提取到序号和古诗名称

import requests
from lxml import etree

response = requests.get('https://paker.net.cn/anti/xpath')
print(response.text)
html = etree.HTML(response.text)
print(html.xpath("//div[@class='page box']//text()"))

此时,我们右键-查看网页源代码

image-20220302141519379

好家伙,人家原来class=“page”,在script里经过addClass操作,展示出来时才变为class="page box"

因为python requests包请求后响应response.text是不能渲染和执行js的等同于查看网页源代码看到的html内容,所以呢通过查看网页源代码找到正确的标签样式就搞定了

2.浏览器补全规范化

一样的示例网址:https://paker.net.cn/anti/xpath

一、 tbody标签

image-20220302142224453

解决了js惹的祸问题后,xpath这样写了//div[@class='page']/table/tbody/tr/td[2],纳尼?还拿不到数据。

还是看看那网页源代码,没有tbody标签的,这个是浏览器自己加上的

image-20220302142448552

ok,tbody不存在,xpath这样写了//div[@class='page']/table/tr/td[2]

二、标签不闭合

报告,还是拿不到数据,再探网页源代码!

image-20220302142748368

只有《/tr》,《tr》哪去了,被哪个小可爱吃掉了。想想办法,python如何把不闭合的标签补全?用它html5lib

import requests
from lxml import etree
from lxml.html import tostring, html5parser
# html5parser底层就是调用了html5lib
response = requests.get('https://paker.net.cn/anti/xpath')
shtml = etree.HTML(tostring(html5parser.fromstring(response.text)))
print(shtml.xpath("//div[@class='page']/table//tr/td[2]/text()"))

最后输出 ['将进酒', '登高', '春江花月夜'],到此就是成功了

3.iframe

示例网址:https://xxgk.mot.gov.cn/2020/jigou/?gk=5

image-20220302143545948

浏览器上的xpath helper都无法定位了,怎么办?

不慌,一不小心就翻到了,iframe提供了一个简单的方式把一个网站的内容嵌入到另一个网站中

image-20220302143714046

所以我们真实该访问的链接是:https://xxgk.mot.gov.cn/2020/jigou/list.html,此时就可以正常定位了

image-20220302144218452