Xpath 定位元素,为何网页可以定位到,代码捕捉不到?

测试网址:www.daomubiji.com/

问题:网页可以定位到元素,但是通过代码请求,获取不到信息

附上代码:

import requests
from lxml import etree

city_url = "http://www.daomubiji.com/"
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.113 Safari/537.36"}
response = requests.get(url=city_url,headers=headers)
html = etree.HTML(response.text)
result = html.xpath('/html/body/section/article/a/div/h2/text()')
print(result)

# 结果为空 []
Jason990420
最佳答案

你读回的网页内容是原始网页码, 谷歌浏览器的开发人员工具是经过处理后的网页码, 通常是javascript处理後的.

  1. 原始网页码, 无 <a>
"""
    <section class="container">
      <article class="article-content">
...
        <div class="homebook">
          <h2>
            盗墓笔记1:七星鲁王宫
          </h2>
...
"""
>>> html.xpath('/html/body/section/article/div/h2/text()')
['盗墓笔记1:七星鲁王宫', '盗墓笔记2:秦岭神树', '盗墓笔记3:云顶天宫', '盗墓笔记4:蛇沼鬼城', '盗墓笔记5:迷海归巢', '盗墓笔记6:阴山古楼', '盗墓笔记7:邛笼石影', '盗墓笔记8:大结局', '盗墓笔记2015年更新', '沙海', '藏海花']
  1. javascript 处理后的网页码, 有<a>
"""
    <section class="container" style="height: auto !important;">
      <article class="article-content" style="height: auto !important;">
        <a href="http://www.daomubiji.com/dao-mu-bi-ji-1">
          <div class="homebook">
            <h2>
              盗墓笔记1:七星鲁王宫
            </h2>
...
        </a>
"""
>>> html.xpath('/html/body/section/article/a/div/h2/text()')
['盗墓笔记1:七星鲁王宫', '盗墓笔记2:秦岭神树', '盗墓笔记3:云顶天宫', '盗墓笔记4:蛇沼鬼城', '盗墓笔记5:迷海归巢', '盗墓笔记6:阴山古楼', '盗墓笔记7:邛笼石影', '盗墓笔记8:大结局', '盗墓笔记2015年更新', '沙海', '藏海花']
2周前 评论
YUAYU- (楼主) 2周前
讨论数量: 3
html.xpath('//div[@class="homebook"]/h2/text()')

用这个

2周前 评论
YUAYU- (楼主) 2周前
Jason990420

你读回的网页内容是原始网页码, 谷歌浏览器的开发人员工具是经过处理后的网页码, 通常是javascript处理後的.

  1. 原始网页码, 无 <a>
"""
    <section class="container">
      <article class="article-content">
...
        <div class="homebook">
          <h2>
            盗墓笔记1:七星鲁王宫
          </h2>
...
"""
>>> html.xpath('/html/body/section/article/div/h2/text()')
['盗墓笔记1:七星鲁王宫', '盗墓笔记2:秦岭神树', '盗墓笔记3:云顶天宫', '盗墓笔记4:蛇沼鬼城', '盗墓笔记5:迷海归巢', '盗墓笔记6:阴山古楼', '盗墓笔记7:邛笼石影', '盗墓笔记8:大结局', '盗墓笔记2015年更新', '沙海', '藏海花']
  1. javascript 处理后的网页码, 有<a>
"""
    <section class="container" style="height: auto !important;">
      <article class="article-content" style="height: auto !important;">
        <a href="http://www.daomubiji.com/dao-mu-bi-ji-1">
          <div class="homebook">
            <h2>
              盗墓笔记1:七星鲁王宫
            </h2>
...
        </a>
"""
>>> html.xpath('/html/body/section/article/a/div/h2/text()')
['盗墓笔记1:七星鲁王宫', '盗墓笔记2:秦岭神树', '盗墓笔记3:云顶天宫', '盗墓笔记4:蛇沼鬼城', '盗墓笔记5:迷海归巢', '盗墓笔记6:阴山古楼', '盗墓笔记7:邛笼石影', '盗墓笔记8:大结局', '盗墓笔记2015年更新', '沙海', '藏海花']
2周前 评论
YUAYU- (楼主) 2周前

在xpath使用上,推荐你用相对路径的方式来写:

result = html.xpath('//div[@class="homebook"]/h2/text()')

# print(result)
['盗墓笔记1:七星鲁王宫', '盗墓笔记2:秦岭神树', '盗墓笔记3:云顶天宫', '盗墓笔记4:蛇沼鬼城', '盗墓笔记5:迷海归巢', '盗墓笔记6:阴山古楼', '盗墓笔记7:邛笼石影', '盗墓笔记8:大结局', '盗墓笔记2015年更新', '沙海', '藏海花']

最简单也不容易出错。从chrome上拷贝的xpath是绝对路径的,中间路径一个错误就会导致检索不到,推荐你看看这篇文章:xpath语法

2周前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!