【问题标题】:Scrapy unable to access child div classScrapy无法访问子div类
【发布时间】:2020-04-02 03:35:26
【问题描述】:

我正在使用 Scrapy 来抓取此网页 https://researchgrant.gov.sg/eservices/advanced-search/?keyword=&source=sharepoint&type=project&status=open&page=2&_pp_projectstatus=&_pp_hiname=ab&_pp_piname=pua&_pp_source=sharepoint&_pp_details=#project 中表格中的 href 链接。我可以访问 div MVCGridTableHolder_advancesearchawardedprojectsp_ 但无法访问它的子元素,即 div 类行和 div 样式,我的尝试如下所示。是不是因为偏观?

html代码:

<div id="MVCGridContainer_advancesearchawardedprojectsp_" data-key="" class="MVCGridContainer">
<!--Partial View!-->
<div class="row"></div>
<div style="overflow-x:auto;">
<table name="MVCGridTable_advancesearchawardedprojectsp" class="table table-striped table-bordered iris-grid">
<thead></thead>
<tbody>
      <tr>
         <td>
         <a class="grid-link" target="_top" href="https://researchgrant.gov.sg/pages/Awarded-Project-Detail.aspx?AXID=MOH-000080&amp;CompanyCode=moh">INVESTIGATING DIVERSIFIED BIFUNCTIONAL MACROCYCLES BY PHAGE DISPLAY AS A NOVEL TECHNOLOGY PLATFORM</a>
         </td>
</div></div>

Scrapy shell 尝试:

In [12]: quote = response.xpath('//div[@id="MVCGridTableHolder_advancesearchawardedprojectsp_"]')

In [13]: quote
Out[13]: [<Selector 
xpath='//div[@id="MVCGridTableHolder_advancesearchawardedprojectsp_"]' data='<div id="MVCGridTableHolder_advancese...'>]

In [14]: quote = response.xpath('//div[@id="MVCGridTableHolder_advancesearchawardedprojectsp_"]/div[@class="row"]')

In [15]: quote
Out[15]: []

【问题讨论】:

  • 两件事:1. 不要将您的代码发布为图像,而是将其发布为文本 2. 很可能,结果是由浏览器动态加载并附加请求并由浏览器呈现(那里的“部分观点”评论指的是那个)
  • 始终将代码、数据和完整的错误消息作为有问题的文本。
  • 你的代码在哪里?你用什么命令来获取它?此页面的 URL 是什么?此页面是否使用 JavaScript 添加元素? Scrapy 无法运行 JavaScript。并将其添加为文本。 Python 无法从图像中读取代码和数据。
  • 大家好,感谢您的意见,我已经进行了一些更新。请耐心指导我,因为我是 Scrapy 的新手。是的,在检查后我认为它使用了 Javascript。对抓取使用 Javascript 的网页有什么建议吗?
  • @alecxe 那么在这种情况下是否可以抓取结果?

标签: python html xpath web-scraping scrapy


【解决方案1】:

如果您在加载此页面时在浏览器中打开浏览器开发人员工具,您会看到发送了一个单独的 XHR 请求来加载该部分视图内容。您可以在代码中模拟该请求。

使用requests的示例:

import requests


with requests.Session() as session:
    session.verify = False

    session.headers = {
        'X-Requested-With': 'XMLHttpRequest'
    }
    response = session.post("https://researchgrant.gov.sg/eservices/mvcgrid", params={
        'keyword': '',
        'source': 'sharepoint',
        'type': 'project',
        'status': 'open',
        'page': '2',
        '_pp_projectstatus': '',
        '_pp_hiname': 'ab',
        '_pp_piname': 'pua',
        '_pp_source': 'sharepoint',
        '_pp_details': ''},
        data={
            'name': 'advancesearchawardedprojectsp'
        })

    print(response.text)

在 Scrapy 中,您可以使用 FormRequest

【讨论】:

  • alrite 非常感谢!将检查并尽快将其标记为答案!欣赏!
  • 感谢您的帮助,我已经能够抓取数据,但该参数似乎在 FormRequest 中不起作用。你知道为什么吗?
  • 'hiname' 和 'ab' 和 'piname' 和 'pua' 应该只返回 1 个结果,而是返回所有结果
猜你喜欢
  • 2021-10-18
  • 1970-01-01
  • 2019-09-09
  • 1970-01-01
  • 2023-04-01
  • 2016-05-20
  • 1970-01-01
  • 2019-10-31
相关资源
最近更新 更多