xpath无法定位tbody标签解决方法示例

 更新时间:2023年09月13日 09:28:48   作者:ponponon  
这篇文章主要介绍了xpath无法定位tbody标签解决方法示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

引言

你用 selenium 抓取,必定有 body你用 requests 抓取,不一定有 body

浏览器会对不存在 body 的情况自动加上 body

所以,你用 requests 抓取就去分析 html tree用 selenium 就去分析 render tree

html tree 就是 networks 标签中的 html 内容;render tree 就是 Elements 标签页中的内容

以前的讲法有点问题,所以再次更新一下,也算是填坑

定位不到tbody是因为标准差异,tbody不是必须存在的

chrome的Elements标签页的tbody是肯定存在的

但是程序员写的网页不一定会有tbody

但是在chrome的Elements标签页不管返回的html有没有tbody,chrome都会有(有就不加,没有就自动加上)

所以用selenium请求网页数据,就加上tbody标签,因为selenium返回的必定是包含tbody的(因为返回的是chrome的Elements标签页的内容)

用requests请求的时候,就自己看看源html内是否真的包含tbody标签(可以在chrome的network标签页下查看)

总结:服务器返回的html不一定有tbody标签(具体看网站前端程序员有没有加tbody标签),但是经过chrome渲染的render html必定包含tbody标签(服务器返回没有的话,浏览器就给你自动加上)

以下是原文
写于2019.10.29日

测试库:lxml库;链接链接:http://www.sxchxx.com/index-13-1075-1.html

问题发现

个人比较喜欢用xpath解析网页,但时常得到的结果却是一个空列表。

1.1 etree.HTML

from lxml import etree
import requests
url = 'http://www.sxchxx.com/index-13-1075-1.html'
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.87 Safari/537.36',
}
resposne = requests.get(url, headers=headers)
parser = etree.HTMLParser(encoding="utf-8")
html = etree.HTML(resposne.text, parser=parser)
resu=html.xpath('//*[@id="large_mid"]/table[2]/tr[3]/td/p//text()')
print(resu)

当用如上代码解析如下网页时,可以获取正文

但发现我们并没有在rule里面加入tbody标签。相反,加入tbody标签会使的解析结果变成一个空列表

html.xpath('//*[@id="large_mid"]/table[2]/tbody/tr[3]/td/p//text()') # 这样会得到空列表

1.2 etree.parse

使用etree.parse和etree.HTML恰好相反

from lxml import etree
import requests

parser = etree.HTMLParser(encoding="utf-8")
html = etree.parse('test.html', parser=parser)


content = html.xpath('//*[@id="large_mid"]/table[2]/tbody/tr[3]/td/p//text()')

print(content)

将网页保存成test.html,再用etree.parse加载,发现rule中加入tbody标签才能获得预期的结果;不加tbody标签会获得一个空列表

1.3 代码对比

from lxml import etree
import requests
parser = etree.HTMLParser(encoding="utf-8")
html = etree.parse('test.html', parser=parser)
content = html.xpath('//*[@id="large_mid"]/table[2]/tbody/tr[3]/td/p//text()')
print(content)
print('----------------分割线-------------------')
url = 'http://www.sxchxx.com/index-13-1075-1.html'
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.87 Safari/537.36',
}
resposne = requests.get(url, headers=headers)
parser = etree.HTMLParser(encoding="utf-8")
html = etree.HTML(resposne.text, parser=parser)
content = html.xpath('//*[@id="large_mid"]/table[2]/tr[3]/td/p//text()')
print(content)

解决问题

2.1曲线救国

如果解析在线网页,不要添加tbody标签反则解析本地(离线)网页,添加tbody标签

2.2其他方法

请看下面的原因分析

问题发生的原因

对比上面两种方法,差异在于
html = etree.parse('test.html', parser=parser)html = etree.HTML(resposne.text)这两行代码

而解析器是相同的parser = etree.HTMLParser(encoding="utf-8")

因此,我猜测,可能是parse或者HTML对代码做了某种“格式化”调整

貌似lxml这个库使用其他语言编写,看不到源代码,无法从源代码下手检查

以上就是xpath无法定位tbody标签解决方法示例的详细内容,更多关于xpath定位tbody标签的资料请关注脚本之家其它相关文章!

相关文章

  • python自动12306抢票软件实现代码

    python自动12306抢票软件实现代码

    这篇文章主要为大家详细介绍了python自动12306抢票软件的实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-02-02
  • python去除所有html标签的方法

    python去除所有html标签的方法

    这篇文章主要介绍了python去除所有html标签的方法,涉及Python正则替换的相关技巧,非常简单实用,需要的朋友可以参考下
    2015-05-05
  • python编程的核心知识点总结

    python编程的核心知识点总结

    在本篇文章里小编给大家整理的是一篇关于python编程的核心知识点总结内容,对此有兴趣的朋友们可以学习参考下。
    2021-02-02
  • Python selenium实现断言3种方法解析

    Python selenium实现断言3种方法解析

    这篇文章主要介绍了Python selenium实现断言3种方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • python中string模块各属性以及函数的用法介绍

    python中string模块各属性以及函数的用法介绍

    下面小编就为大家带来一篇python中string模块各属性以及函数的用法介绍。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-05-05
  • Python中re模块下的函数详解

    Python中re模块下的函数详解

    这篇文章主要介绍了Python中re模块下的函数详解,re.match() 函数是从头开始匹配一个符合规则的字符串,从起始位置开始匹配,匹配成功返回一个对象,未匹配成功返回None,需要的朋友可以参考下
    2023-08-08
  • opencv实现图像缩放效果

    opencv实现图像缩放效果

    这篇文章主要为大家详细介绍了opencv实现图像缩放效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-03-03
  • python操作xml文件示例

    python操作xml文件示例

    这篇文章主要介绍了python操作xml文件示例,需要的朋友可以参考下
    2014-04-04
  • 解决PyCharm 中写 Turtle代码没提示以及标黄的问题

    解决PyCharm 中写 Turtle代码没提示以及标黄的问题

    这篇文章主要介绍了解决PyCharm 中写 Turtle代码没提示以及标黄的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-03-03
  • Python之列表推导式最全汇总(上篇)

    Python之列表推导式最全汇总(上篇)

    这篇文章主要介绍了Python之列表推导式最全汇总(上篇),本文章内容详细,通过案例可以更好的理解列表推导式的相关知识,本模块分为了三部分,本次为上篇,需要的朋友可以参考下
    2023-01-01

最新评论