【问题标题】:Python web-scraping returned nothing/null when scraping a table content抓取表格内容时,Python web-scraping 没有返回任何内容/null
【发布时间】:2019-08-06 19:32:06
【问题描述】:

我是 Python 新手,现在我正在尝试从 BMO 网站 (https://www.bmo.com/home/personal/banking/rates/foreign-exchange) 抓取货币买入/卖出率,但是,当我尝试抓取时,我得到的只是一无所获。

我通过一个示例学习,并在下面使用 Visual Studio 2019 编写了一个非常示例。我可以从这些网站打印段落文本,但是当我将 xpath 更改为表格单元格元素路径时,它什么也没返回。

用于抓取段落文本和工作:

---------

import requests

from lxml.html import etree

url = 'https://www.bmo.com/home/personal/banking/rates/foreign-exchange'

r=requests.get(url).text

s=etree.HTML(r)

file = s.xpath('//*[@id="main_content"]/p[2]/text()')

print(file)

---------

它运行良好且输出:提供的费率......页面底部也是如此。

当将 s.xpath 改回 '//*[@id="ratesTable"]/tbody/tr[2]/td[3]/text()' 时, (我正在尝试按美元计算卖出率), 它返回了一个'​​[]',里面什么都没有。我用'file'元素调试,里面什么都没有,长度也是0。

我在这里做错了吗?我相信 xpath 和 url 是正确的。 我希望我能在单元格中得到十进制数 1.2931(销售率)。

【问题讨论】:

    标签: python web-scraping


    【解决方案1】:

    您在页面上看到的数据是通过 Javascript 从不同的 URL 动态加载的。使用 re 和 'ast' 模块,您可以检索此信息:

    import re
    import requests
    from ast import literal_eval
    
    data_url = 'https://www.bmo.com/bmocda/templates/json_fx_include.jsp'
    
    data = literal_eval( re.findall(r'FX = (\{.*?\});',  requests.get(data_url).text, flags=re.DOTALL)[0] )
    
    from pprint import pprint
    pprint(data)
    
    print(data['USD']['NA']['BUY'])
    

    打印:

    {'EUR': {'NA': {'BUY': '1.4069', 'SELL': '1.5288'},
             'OA': {'BUY': '1.4472', 'SELL': '1.5137'},
             'OB': {'BUY': '1.4523', 'SELL': '1.5092'},
             'OC': {'BUY': '1.456', 'SELL': '1.5055'},
             'OD': {'BUY': '1.4634', 'SELL': '1.4982'}},
     'USD': {'NA': {'BUY': '1.2931', 'SELL': '1.3589'},
             'OA': {'BUY': '1.2958', 'SELL': '1.3562'},
             'OB': {'BUY': '1.3027', 'SELL': '1.3493'},
             'OC': {'BUY': '1.3061', 'SELL': '1.3459'},
             'OD': {'BUY': '1.3075', 'SELL': '1.3445'}}}
    1.2931
    

    【讨论】:

      【解决方案2】:

      现在许多网站动态加载内容或通过一些 javascript 修改文档对象模型。这样的网站仍然可以被抓取,但您必须深入挖掘 javascript 部分。

      在这种特殊情况下,表格是通过 javascript 调用加载的,您可以通过在浏览器中禁用 javascript 来验证这一点。如果您的浏览器支持它,请打开 Web 开发人员工具并检查网络页面,这将显示为生成此页面而加载的所有资源。在这些资源中,您会发现一些有趣的 javascript 片段,例如 json_fx_include.js,它似乎包含您要查找的数据。

      【讨论】:

      • 感谢您的建议。这正是让我有点困惑的问题。因为当我调试代码时,即使我的 xpath 是正确的,文件仍然无法加载任何东西。我看到了这些资源,但是我对在哪里以及如何找到它有点困惑。我想知道我们以后会不会遇到一些类似的问题,并且网站有大量的资源,我们是否应该复制函数名称并在资源选项卡中手动搜索每个文件?或者我们可以有一些更简单的方法来做到这一点?对不起,我在这部分很新:(
      猜你喜欢
      • 2019-04-27
      • 2020-08-27
      • 1970-01-01
      • 1970-01-01
      • 2018-07-30
      • 1970-01-01
      • 1970-01-01
      • 2018-05-09
      • 1970-01-01
      相关资源
      最近更新 更多