抓取表格内容时,Python的网络抓取未返回任何内容/为空

时间:2019-08-06 19:32:06

标签: python web-scraping

我是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(销售率)。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

如今,许多网站都动态地加载内容或通过一些JavaScript修改文档对象模型。这样的网站仍然可以被抓取,但是您必须深入研究javascript片段。

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