【问题标题】:Why isn't this XPath working? [duplicate]为什么这个 XPath 不起作用? [复制]
【发布时间】:2015-06-10 08:07:48
【问题描述】:

我正在尝试获取股票的公司名称、部门和行业。我下载了'https://finance.yahoo.com/q/in?s={}+Industry'.format(sign) 的HTML,然后尝试用lxml.html 中的.xpath() 解析它。

要获取我要抓取的数据的 XPath,我在 Chrome 中转到该站点,右键单击该项目,单击 Inspect Element,右键单击突出显示的区域,然后单击 Copy XPath .这在过去一直对我有用。

这个问题可以用下面的代码复现(我以苹果为例):

import requests
from lxml import html

page_p = 'https://finance.yahoo.com/q/in?s=AAPL+Industry'
name_p = '//*[@id="yfi_rt_quote_summary"]/div[1]/div/h2/text()'
sect_p = '//*[@id="yfncsumtab"]/tbody/tr[2]/td[1]/table[2]/tbody/tr/td/table/tbody/tr[1]/td/a/text()'
indu_p = '//*[@id="yfncsumtab"]/tbody/tr[2]/td[1]/table[2]/tbody/tr/td/table/tbody/tr[2]/td/a/text()'

page = requests.get(page_p)
tree = html.fromstring(page.text)

name = tree.xpath(name_p)
sect = tree.xpath(sect_p)
indu = tree.xpath(indu_p)

print('Name: {}\nSector: {}\nIndustry: {}'.format(name, sect, indu))

给出这个输出:

Name: ['Apple Inc. (AAPL)']
Sector: []
Industry: []

它没有遇到任何下载困难,因为它能够检索name,但其他两个不起作用。如果我分别用tr[1]/td/a/text()tr[1]/td/a/text() 替换它们的路径,它会返回:

Name: ['Apple Inc. (AAPL)']
Sector: ['Consumer Goods', 'Industry Summary', 'Company List', 'Appliances', 'Recreational Goods, Other']
Industry: ['Electronic Equipment', 'Apple Inc.', 'AAPL', 'News', 'Industry Calendar', 'Home Furnishings & Fixtures', 'Sporting Goods']

显然我可以切出每个列表中的第一项来获取我需要的数据。

我不明白的是,当我将 tbody/ 添加到开头 (//tbody/tr[#]/td/a/text()) 时,它再次失败,即使 Chrome 中的控制台清楚地将 trs 显示为 tbody 的孩子元素。

为什么会这样?

【问题讨论】:

    标签: python html xpath lxml


    【解决方案1】:

    浏览器解析 HTML 并从中构建元素树;在该过程中,他们将插入输入 HTML 文档中可能缺少的元素。

    在这种情况下,<tbody> 元素不在源 HTML 中。您的浏览器会插入它们,因为如果缺少它们,它们会隐含在结构中。然而,LXML 不会插入它们。

    因此,您的浏览器工具并不是构建 XPath 查询的最佳工具。

    删除tbody/ 路径元素会产生您正在寻找的结果:

    >>> sect_p = '//*[@id="yfncsumtab"]/tr[2]/td[1]/table[2]/tr/td/table/tr[1]/td/a/text()'
    >>> indu_p = '//*[@id="yfncsumtab"]/tr[2]/td[1]/table[2]/tr/td/table/tr[2]/td/a/text()'
    >>> tree.xpath(sect_p)
    ['Consumer Goods']
    >>> tree.xpath(indu_p)
    ['Electronic Equipment']
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-14
    • 2018-03-13
    • 2011-03-10
    • 2016-01-13
    • 2016-08-18
    • 2012-12-24
    相关资源
    最近更新 更多