我正在寻找一种更好的方法来从https://www.remitly.com/us/en/india抓取最新汇率
在下面的当前代码中,我得到16个'script'实例,然后遍历每个实例,然后查看它们是否包含汇率是一种处理方法。有更好的方法吗?
这里的问题是我不能在soup.find_all()
中使用其他属性。而且数组元素太大。
# get current exchange rate
import bs4 as bs
import urllib.request
import parser
from pprint import pprint
source = urllib.request.urlopen('https://www.remitly.com/us/en/india')
soup = bs.BeautifulSoup(source,'lxml')
#js_test = soup.findAll('td', class_='f1smo2ix')
cost = soup.find_all('script')
print(cost)
print(len(cost))
答案 0 :(得分:2)
使用.find_next_sibling(text=True)
的解决方案,您可以使用import requests
from bs4 import BeautifulSoup
url = 'https://www.remitly.com/us/en/india'
soup = BeautifulSoup(requests.get(url).content, 'html.parser')
print( soup.select_one('sup:contains("₹")').find_next_sibling(text=True) )
来获得费率:
75.55
打印:
{{1}}
答案 1 :(得分:1)
我认为最好的方法是使用xpath。您可以使用//sup[text() = '₹']
之类的查询来查找具有文本内容<sup>
的{{1}}个元素。找到它之后,将其文本放在parent中。这是适合您情况的工作示例:
₹
答案 2 :(得分:0)
我最终抓取了<script> \__REMITLY_LANDING_PAGE_CONTEXT__ = { \** *JSON OBJECT HERE* ** } </script>
JSON对象提供了一些易于访问的其他详细信息。下面是代码:
# get current exchange rate
import bs4 as bs
import urllib.request
import re
import json
url = 'https://www.remitly.com/us/en/india'
source = urllib.request.urlopen(url)
soup = bs.BeautifulSoup(source,'lxml')
script = soup.find('script', text=re.compile('__REMITLY_LANDING_PAGE_CONTEXT__'))
nextsc = script.next.strip('__REMITLY_LANDING_PAGE_CONTEXT__ = ')
json_obj = json.loads(nextsc)
economy = json_obj['context']['forex']['current']['economy']['everyday']
print("Economy rate 1 USD is " + economy + " INR.")
express = json_obj['context']['forex']['current']['express']['everyday']
print("Express rate 1 USD is " + express + " INR.")
special = json_obj['context']['forex']['current']['express']['effective']
print("Special rate for first time senders 1 USD is " + special + " INR.")
感谢@ andrej-kesely和@dorukerenaktas的回答,使我可以对这个话题进行更多的思考。