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调用实现最小二乘法的方法详解

    Python调用实现最小二乘法的方法详解

    所谓线性最小二乘法,可以理解为是解方程的延续,区别在于,当未知量远小于方程数的时候,将得到一个无解的问题。本文主要和大家分享Python调用实现最小二乘法的方法,需要的可以参考一下
    2023-04-04
  • python处理xls文件openpyxl基础操作

    python处理xls文件openpyxl基础操作

    这篇文章主要为大家介绍了python处理xls文件openpyxl基础操作,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • 在Python中如何使用yield

    在Python中如何使用yield

    在 Python 开发中,yield 关键字的使用其实较为频繁,例如大集合的生成,简化代码结构、协程与并发都会用到它,文中详细介绍了yield的用法,需要的朋友可以参考下
    2021-06-06
  • python基础之入门必看操作

    python基础之入门必看操作

    下面小编就为大家带来一篇python基础之入门必看操作。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-07-07
  • python xpath获取页面注释的方法

    python xpath获取页面注释的方法

    今天小编就为大家分享一篇python xpath获取页面注释的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-01-01
  • Python中MYSQLdb出现乱码的解决方法

    Python中MYSQLdb出现乱码的解决方法

    这篇文章主要介绍了Python中MYSQLdb出现乱码的解决方法,是Python操作MySQL数据库程序设计中非常常见的问题,需要的朋友可以参考下
    2014-10-10
  • Python lambda函数使用方法深度总结

    Python lambda函数使用方法深度总结

    在本文中,小编将带大家学习一下Python中的lambda函数,并探讨使用它的优点和局限性。文中的示例代码讲解详细,感兴趣的可以了解一下
    2022-05-05
  • python实现贪吃蛇双人大战

    python实现贪吃蛇双人大战

    这篇文章主要为大家详细介绍了python实现贪吃蛇双人大战,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-04-04
  • Python利用第三方模块实现压缩css文件

    Python利用第三方模块实现压缩css文件

    在 Python 中可以使用多种方法来压缩 CSS 文件。其中一种流行的方法是使用 csscompressor 库,这个库可以帮助你压缩 CSS 代码,下文就来和大家详细聊聊
    2023-01-01
  • 解决Pycharm无法import自己安装的第三方module问题

    解决Pycharm无法import自己安装的第三方module问题

    今天小编就为大家分享一篇解决Pycharm无法import自己安装的第三方module问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-05-05

最新评论