我是Python的新手,现在我正在尝试从蒙特利尔银行网站(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)它工作良好,输出:提供的费率...页面底部也是如此。
当将文本改回‘//*@id=“ratesTable”/tbody/tr2/td3/ s.xpath ()’时(我正在尝试以美元计算卖价),它返回一个'[]‘,其中没有任何内容。我调试了'file‘元素,它里面什么都没有,长度也是0。
我是不是做错了什么?我相信xpath和url是正确的。我希望我能在单元格中得到十进制数1.2931 (卖出率)。
发布于 2019-08-07 03:42:35
您在页面上看到的数据是通过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发布于 2019-08-07 03:44:43
目前许多网站都是通过javascript动态加载内容或修改文档对象模型。这样的网站仍然可以被抓取,但你必须深入研究javascript片段。
在这种情况下,表是通过javascript调用加载的,您可以通过在浏览器中禁用javascript来进行验证。如果您的浏览器支持,请打开web开发人员工具并检查网络页面,该页面将显示为生成此页面而加载的所有资源。在这些资源中,你会发现一些有趣的javascript片段,比如json_fx_include.js,它似乎保存了你正在寻找的数据。
https://stackoverflow.com/questions/57382835
复制相似问题