【问题标题】:Why does Scrapy selector only bring the parent element?为什么 Scrapy 选择器只带父元素?
【发布时间】:2020-05-30 13:34:24
【问题描述】:

我正在尝试设置一个 Scrapy 选择器以从 Trezor 支持的硬币页面 (https://trezor.io/coins/) 获取表格上的一些数据:

In [1]: import requests
   ...: from scrapy.selector import Selector
   ...: req = requests.get('https://trezor.io/coins/').content
   ...: xs = '//*[@id="content"]/tr'
   ...: sel = Selector(text=req).xpath(xs)

In [2]: sel.extract_first()
Out[2]: '<tr class="coin  " data-href="./#BTC" id="BTC"></tr>'

选择器不应该带来tr 元素及其内部的所有内容(在这种情况下,六个td 元素具有更多内部元素?当我尝试手动访问td 元素时(使用@ 987654328@ 或xs = '//*[@id="content"]/tr[1]/td[1]'),我得到的只是一个空列表。我也尝试获取child nodes,但无济于事。

Cf.Wikipedia's 主页上提取,您可以在其中获取指定容器内的所有内容:

In [3]: req2 = requests.get('https://en.wikipedia.org/wiki/Main_Page').content
   ...: xd = '//*[@id="mp-welcomecount"]'
   ...: sel2 = Selector(text=req2).xpath(xd)

In [4]: sel2.extract_first()
Out[4]: '<div id="mp-welcomecount">\n<div id="mp-welcome">Welcome to <a href="/wiki/Wikipedia" title="Wikipedia">Wikipedia</a>,</div>\n<div id="mp-free">the <a href="/wiki/Free_content" title="Free content">free</a> <a href="/wiki/Encyclopedia" title="Encyclopedia">encyclopedia</a> that <a href="/wiki/Help:Introduction" title="Help:Introduction">anyone can edit</a>.</div>\n<div id="articlecount"><a href="/wiki/Special:Statistics" title="Special:Statistics">6,088,421</a> articles in <a href="/wiki/English_language" title="English language">English</a></div>\n</div>'

为什么在 Trezor 的情况下我只得到 tr 元素,我该如何更正我的代码以将其中包含的所有内容都包含在内?

【问题讨论】:

    标签: python html xpath web-scraping scrapy


    【解决方案1】:

    在解析页面时,Scrapy 似乎有点不对劲(tr 结束标记出错)。 tr 和 td 元素之间没有“父子”连接。你只有兄弟姐妹。解析页面的结构:

    tr
    td
     span
      img
    td
     strong
     small
     a
    td
     img
    td
     img
    td
     a
     a
     a
     a
    td
     a
     a
    tr
    ...
    

    也许您可以使用以下 XPath 表达式从表中获取所有数据:

    //tr[contains(@class,"coin")][1]/following-sibling::td
    

    输出:8364 个节点

    或者在scrapy设置中寻找一个神奇的选项。

    【讨论】:

    • 我很好奇您是如何发现这些节点是兄弟节点而不是分层的。我在浏览器上使用开发者工具时假设结构是正确的,为什么它还会错误地显示trtd 之间的关系?
    • 有了scrapy shell,你可以使用view(response)。这将在以下文件夹 (Windows) 中创建一个临时文件 (tmpxxxxx.html):C:/Users/yourusername/AppData/Local/Temp/。您现在可以使用 Notepad++ 或类似工具研究该文件。
    猜你喜欢
    • 2017-11-29
    • 2021-05-13
    • 1970-01-01
    • 1970-01-01
    • 2013-04-12
    • 1970-01-01
    • 2019-07-16
    • 1970-01-01
    • 2012-08-24
    相关资源
    最近更新 更多