如何使用BeautifulSoup使用动态脚本抓取网页?

时间:2020-06-05 04:35:59

标签: python beautifulsoup

我正在寻找一种更好的方法来从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))

3 个答案:

答案 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的回答,使我可以对这个话题进行更多的思考。

相关问题