【问题标题】:xpath matching wrong nodexpath匹配错误的节点
【发布时间】:2015-06-24 12:10:54
【问题描述】:

xpath

//*[h1]

在 python 和 Firebug 上尝试时显示不同的结果。我的代码:

import requests
from lxml import html

url = "http://machinelearningmastery.com/naive-bayes-classifier-scratch-python/"
resp = requests.get(url)
page = html.fromstring(resp.content)

node = page.xpath("//*[h1]")
print node
#[<Element center at 0x7fb42143c7e0>]

但 Firebug 匹配 &lt;header&gt; 标记,这是我想要的。

为什么会这样?如何让我的 python 代码也匹配&lt;header&gt;

【问题讨论】:

  • 您是否要获取所有h1 节点?为什么不简单地使用.//h1h1&lt;center&gt; 包裹,那么除此之外你还能期待什么?
  • @Anzel 我正在尝试获取 包含 h1 的节点,而不是 h1 本身。
  • 我在重新阅读您的 xpath 后意识到。但是您的 resp&lt;center&gt;&lt;h1&gt;403 Forbidden&lt;/h1&gt;&lt;/center&gt;... 所以返回 &lt;center&gt; 节点是正确的
  • 哇哦!但是该网址在浏览器中可以正常打开!知道为什么它在requests 中被禁止吗?
  • 我猜可能是缺少 UserAgent 字符串,或者您可能在浏览器的某个位置登录了会话;)

标签: python-2.7 xpath lxml.html


【解决方案1】:

您缺少 User-Agent 标头,因此返回的响应内容 403 Forbidden,将其添加到请求并按预期工作:

In [9]: resp = requests.get(url, headers={"User-Agent": "Test Agent"})

In [10]: page = html.fromstring(resp.content)

In [11]: node = page.xpath("//*[h1]")

In [12]: print node
[<Element header at 0x104ff15d0>]

【讨论】:

  • 知道为什么这个网址需要那个吗? '因为没有明确提及用户代理,其他 url 工作正常?
  • @anupamGak,正如我上面评论的那样,这取决于服务器配置,有些会在没有用户代理的情况下阻止请求,但有些则不会。更重要的是,有时库/工具会自动为您添加一个,如果它没有明确设置,您可能不知道:)
猜你喜欢
  • 1970-01-01
  • 2018-04-18
  • 1970-01-01
  • 1970-01-01
  • 2013-03-27
  • 1970-01-01
  • 2011-08-01
  • 2010-12-09
  • 1970-01-01
相关资源
最近更新 更多