我是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(销售率)。
答案 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,它似乎保存着您要查找的数据。