Python爬虫——从浏览器复制的Xpath无法解析(tbody)

今天遇到一个问题,我的爬虫想抓取一个网页上的有些内容,使用Xpath解析的方式。前几个内容都可以被Xpath解析,但是最后一个标签内的内容始终解析不到,困扰了我一上午。最后我一步一步尝试解决了。但是我并不知道是为什么?这个场景就是程序已经执行起来了,但是你完全不知道它为什么能正常运行。下图可以完美描述。

下面这个视频更加生动:当你写了一个乱七八糟的程序,它却恰好完成了任务_哔哩哔哩_bilibili,建议反复观看。

后来,经过我反复斟酌关键字,进行搜索,看到前辈们的经验,发现原来是浏览器的锅。经测试,Firefox和Chrome在检查的时候,你看到的代码是经过浏览器优化的。不是网页原本的源码。这时候就会导致你复制的Xpath是错误的,因此你的Python爬虫解析不到任何内容。这个时候的你很懵。明明前面的Xpath都没有问题,抓取到了相应的内容,但是偏偏唯独这一个抓取不到。

真实案例如下,浏览器检查的时候,看到的源码会加上tbody标签,但是实际代码里是没有这个标签的,所以复制的Xpath不对。

上图是通过检查(F12)看到的源码以及复制的Xpath,但是通过查看网页源代码看到的代码没有tbody。如下图所示。table下面直接就是tr标签了,根本没有tbody标签。所以,lxml要是能找到内容才是见鬼了。

经测试,Firefox,Chrome,Edge浏览器都会自动加上这个tbody标签,真是巨坑一个。别人是站在巨人的肩膀上,我是站在巨人挖的坑里,简称“巨坑”。 因此,当Xpath解析不到内容的时候,建议看一下源码。

我之前的代码里的Xpath是://*[@id="main-content"]/section/div[3]/div/table/tbody/tr[2]/td[2]/pre/text()

真实的Xpath其实是://*[@id="main-content"]/section/div[3]/div/table/tr[2]/td[2]/pre/text()

  • 5
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
Python爬虫可以用于12306抢票,具体步骤如下: 1. 首先,需要安装selenium和chromedriver,selenium是一个自动化测试工具,chromedriver是一个控制Chrome浏览器的驱动程序。 ```python !pip install selenium ``` 2. 导入selenium和time模块,设置浏览器驱动路径和乘车日期等信息。 ```python from selenium import webdriver import time # 设置浏览器驱动路径 driver_path = 'chromedriver.exe' # 设置乘车日期 date = '2022-01-01' ``` 3. 打开Chrome浏览器,并访问12306官网。 ```python # 打开Chrome浏览器 driver = webdriver.Chrome(executable_path=driver_path) # 访问12306官网 driver.get('https://www.12306.cn/index/') ``` 4. 登录12306账号,输入用户名和密码,然后手动输入验证码。 ```python # 等待用户手动输入验证码 time.sleep(30) ``` 5. 在出发地和目的地输入框中输入相应的城市名称,然后选择乘车日期。 ```python # 输入出发地和目的地 driver.find_element_by_id('fromStationText').click() driver.find_element_by_id('fromStationText').clear() driver.find_element_by_id('fromStationText').send_keys('北京') driver.find_element_by_id('toStationText').click() driver.find_element_by_id('toStationText').clear() driver.find_element_by_id('toStationText').send_keys('上海') # 选择乘车日期 js = "document.getElementById('train_date').removeAttribute('readonly')" driver.execute_script(js) driver.find_element_by_id('train_date').clear() driver.find_element_by_id('train_date').send_keys(date) ``` 6. 点击查询按钮,等待页面加载完成。 ```python # 点击查询按钮 driver.find_element_by_id('search_one').click() # 等待页面加载完成 time.sleep(10) ``` 7. 选择车次和座位类型,然后点击预订按钮。 ```python # 选择车次和座位类型 driver.find_element_by_xpath('//tbody/tr[1]/td[13]/a').click() time.sleep(2) driver.find_element_by_xpath('//ul[@id="normal_passenger_id"]/li[1]/label') driver.find_element_by_id('submitOrder_id').click() ``` 8. 点击确认按钮,等待页面加载完成。 ```python # 点击确认按钮 driver.find_element_by_id('qr_submit_id').click() # 等待页面加载完成 time.sleep(10) ``` 9. 最后,可以通过邮件或短信等方式通知自己是否抢到了车票。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值