【问题标题】:XPath: Assessing an Error in this Line of Code?XPath:评估这行代码中的错误?
【发布时间】:2014-12-28 08:56:45
【问题描述】:

我最近开始为一个 Python 项目学习 XPath,但我似乎无法通过以下行来选择正确的数据。

//table[@id="yfncsumtab"]//tr/td/a[@rel="first"]

上述数据见本页:http://finance.yahoo.com/q/hp?s=QQQX+Historical+Prices

(检查元素的“下一步”链接以访问我试图创建 XPath 的代码。换句话说,该页面上的 Command/Control F,检查元素是第一个结果)

我尝试了该代码的许多变体,但似乎没有一个选择正确的文本。感谢所有帮助 - 提前致谢!

【问题讨论】:

  • 那个元素在哪里?
  • 如何进入页面?我收到“嗯……您要查找的页面不在这里。请尝试在上方搜索。” (不在美国)
  • 如果你“检查元素”“下一步”链接,你应该被带到它。
  • 重做链接。现在工作? @elyase
  • 是的,现在可以了,我发布了一个解决方案。

标签: python xpath finance stock


【解决方案1】:
'//a[text()="Next"]'

或:

'//table[@id = "yfncsumtab"]//a[text()="Next"]'

或者,只获取第一个:

'//table[@id = "yfncsumtab"]//table[1]/tr/td/a[text()="Next"]'

或:

'//table[@id="yfncsumtab"]/tr[2]/td[1]/table[1]/tr/td/a[1]'

您越具体,找到元素的速度就越快。但是,您越具体,xpath 就越脆弱:如果开发人员对目标元素周围的 html 结构进行了微小的更改,您的代码将无法正常工作。

from lxml import html

doc = html.parse("http://finance.yahoo.com/q/hp?s=QQQX+Historical+Prices")

my_xpath = '//a[text()="Next"]'

for element in doc.xpath(my_xpath):
    print("<{}>".format(element.tag))
    print("  text = {}".format(element.text))

    for attr, val in element.items():
        print("  {} = {}".format(attr, val))


--output:--
<a>
  text = Next
  rel = next
  href = /q/hp?s=QQQX&d=11&e=28&f=2014&g=d&a=1&b=1&c=2007&z=66&y=66
<a>
  text = Next
  rel = next
  href = /q/hp?s=QQQX&d=11&e=28&f=2014&g=d&a=1&b=1&c=2007&z=66&y=66

【讨论】:

  • 谢谢你——感觉就像你读懂了我的想法!在过去的几分钟里,我一直在思考我应该如何追求我的下一个目标:打印“href”——但你只是为我(和世界其他地方)提供了如何做到这一点的很好的回应,并且更多的!再次,谢谢! :-) (希望我能投票,需要等到 15 个代表)
  • @TheNovice,您不必遍历所有属性即可获得 href:element.get('href') 有效。
【解决方案2】:

试试这个:

//*[(@id = "yfncsumtab")]//a[(((count(preceding-sibling::*) + 1) = 3) and parent::*)]

通过这个 Xpath,我可以同时获得顶部和底部的“下一步”链接。

【讨论】:

  • 谢谢!我目前有那个选择器小工具,但它提供的 XPath(对于这个例子)只是“//a”,有点太宽泛了。您是否碰巧知道任何(未来)可以提供更具体的答案的事情? (另外:还有整整五分钟,我才能给出最佳答案!来吧......)
  • Chrome 检查器,然后复制 XPath。但并非总是有效。我认为 Firebug 也会这样做,但我从未尝试过。我主要使用 pyquery 和 CSS 选择器,因为我从事网页设计工作。
  • 是的,也试过了。猜猜最可靠的方法是学习XPath。再次感谢您的帮助 - 非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-07
  • 1970-01-01
  • 1970-01-01
  • 2018-11-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多