【问题标题】:How to scrape this HTML structure with a tbody in Scrapy?如何在 Scrapy 中用 tbody 抓取这个 HTML 结构?
【发布时间】:2020-07-26 23:36:17
【问题描述】:
<table id="myTable" class="table table-striped table-bordered text-center table-condensed removeSidePadding" style="" xpath="1">
<thead class="success" style="padding: 15px; font-family: 'Nunito', sans-serif;"></thead>
    <tbody style="">
      <tr class="active" data-index="0" style=""></tr>
      <tr data-index="1" style=""></tr>
      <tr class="active" data-index="2"></tr>
      <tr data-index="3"></tr>
      <tr class="active" data-index="4"></tr>
      <tr data-index="5"></tr>
      <tr class="active" data-index="6"></tr>
      <tr data-index="7"></tr>
      <tr class="active" data-index="8"></tr>
      <tr data-index="9"></tr>
    </tbody>
 </table>

至于要展示的代码,除了 Scrapy 生成的样板文件外,我没有太多要展示的东西。我一直专门在 shell 中工作,所以我可以一一挑选这些元素,但我遇到的问题是空列表。我之前做过研究,发现scrapy不会拾取这些tbody标签,因为浏览器会生成它们。 (目前使用最新的 FireFox)。

我想要的数据在 tr 标签内,我想我以后可以完成,但我在之前的元素上苦苦挣扎。

我在 parse 方法上确实取得了一些进展,但我再次遇到 tbody 标记返回空的问题。

那么最终我该如何解析呢?

    def parse(self, response):
    contents = response.xpath("//table[@id='myTable']")

    for content in contents:
        pass

【问题讨论】:

  • 您能否提供您要废弃的 URL,以便我查看?

标签: python-3.x scrapy screen-scraping


【解决方案1】:

如果 tbody 在源页面中不存在并且由浏览器生成,Scrapy 将不会找到它,但如果它们在源中,则会完美选择它们。您可以通过查看您的 scrapy 收到的 response.body 来检查。

不管怎样,就是要调整正确的路径。

如果源不使用 tbody:

response.xpath("//table[@id='myTable']/tr").getall()

如果是这样:

response.xpath("//table[@id='myTable']/tbody/tr").getall()

【讨论】:

  • 我在我的 shell 中运行了这两个,但它们仍然返回给我空列表。我错过了什么吗?我忘了在我原来的帖子中添加这个,但我正在抓取的内容都是 JS 生成的,但为了解决这个问题,我使用了 scrapy_splash。
猜你喜欢
  • 2020-03-17
  • 2018-03-08
  • 1970-01-01
  • 2023-04-10
  • 2020-03-17
  • 2018-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多