【问题标题】:Python: Read value from code in a websitePython:从网站中的代码中读取值
【发布时间】:2016-07-27 12:49:07
【问题描述】:

我最初认为很多人都会遇到一个问题,但我找不到任何类似的问题。我使用的语言是 Python

我想从网站中读取特定值,该值嵌入​​在后面的另一个代码中。我首先认为this approach here 可以工作。 (下载 html 页面,然后读取特定行)。但问题是,我正在寻找的值是在另一个类或代码中不断生成的。所以基本上当我尝试用 Chrome 查看 html 代码时,我找不到我喜欢的值。

我正在尝试阅读的页面:Page。我需要的值是 以欧元计的每以太币价格

感谢您的帮助!

【问题讨论】:

  • 欢迎来到 SO,请在提问时更具体一点:您尝试过什么,您期望什么等。请参阅how to ask
  • 如果该值是由 javascript 生成的,您将需要类似 selenium 的东西来提取它
  • 我基本上是下载了页面的html并搜索了值。但是该值是由 javascript 函数创建的。那么如何使用 python 中的代码访问我需要的值呢?
  • 我应该补充一点,我刚刚开始学习编码,所以请怜悯我:)
  • 我刚刚确认该页面是使用 javascript 创建的。所以谷歌硒,你会发现一些如何继续的例子。

标签: python html url


【解决方案1】:

页面数据来自一个XHR加载的json blob,可以直接查询。

>>> import requests
>>> import pprint
>>> r = requests.get('http://ether.price.exchange/update')
>>> pprint.pprint(r.json())
{u'AUD': {u'15m': 873.83,
          u'buy': 873.83,
          u'last': 873.83,
          u'sell': 873.85,
          u'symbol': u'$'},
 u'BRL': {u'15m': 2140.39,
          u'buy': 2140.39,
          u'last': 2140.39,
          u'sell': 2140.42,
          u'symbol': u'R$'},
 u'CAD': {u'15m': 860,
          u'buy': 860,
          u'last': 860,
          u'sell': 860.02,
          u'symbol': u'$'},
 u'CHF': {u'15m': 643.67,
          u'buy': 643.67,
          u'last': 643.67,
          u'sell': 643.68,
          u'symbol': u'CHF'},
 u'CLP': {u'15m': 428297.17,
          u'buy': 428297.17,
          u'last': 428297.17,
          u'sell': 428303.73,
          u'symbol': u'$'},
 u'CNY': {u'15m': 4359.5,
          u'buy': 4359.5,
          u'last': 4359.5,
          u'sell': 4359.56,
          u'symbol': u'\xa5'},
 u'DKK': {u'15m': 4416.7,
          u'buy': 4416.7,
          u'last': 4416.7,
          u'sell': 4416.76,
          u'symbol': u'kr'},
 u'EUR': {u'15m': 593.66,
          u'buy': 593.66,
          u'last': 593.66,
          u'sell': 593.67,
          u'symbol': u'\u20ac'},
 u'GBP': {u'15m': 496.02,
          u'buy': 496.02,
          u'last': 496.02,
          u'sell': 496.02,
          u'symbol': u'\xa3'},
 u'HKD': {u'15m': 5062.79,
          u'buy': 5062.79,
          u'last': 5062.79,
          u'sell': 5062.87,
          u'symbol': u'$'},
 u'ISK': {u'15m': 79579.79,
          u'buy': 79579.79,
          u'last': 79579.79,
          u'sell': 79581.01,
          u'symbol': u'kr'},
 u'JPY': {u'15m': 69110.23,
          u'buy': 69110.23,
          u'last': 69110.23,
          u'sell': 69111.28,
          u'symbol': u'\xa5'},
 u'KRW': {u'15m': 742032.87,
          u'buy': 742032.87,
          u'last': 742032.87,
          u'sell': 742044.24,
          u'symbol': u'\u20a9'},
 u'NZD': {u'15m': 933.8,
          u'buy': 933.8,
          u'last': 933.8,
          u'sell': 933.82,
          u'symbol': u'$'},
 u'PLN': {u'15m': 2589.46,
          u'buy': 2589.46,
          u'last': 2589.46,
          u'sell': 2589.5,
          u'symbol': u'z\u0142'},
 u'RUB': {u'15m': 42472.95,
          u'buy': 42472.95,
          u'last': 42472.95,
          u'sell': 42473.6,
          u'symbol': u'RUB'},
 u'SEK': {u'15m': 5637.68,
          u'buy': 5637.68,
          u'last': 5637.68,
          u'sell': 5637.77,
          u'symbol': u'kr'},
 u'SGD': {u'15m': 887.79,
          u'buy': 887.79,
          u'last': 887.79,
          u'sell': 887.81,
          u'symbol': u'$'},
 u'THB': {u'15m': 22835.96,
          u'buy': 22835.96,
          u'last': 22835.96,
          u'sell': 22836.31,
          u'symbol': u'\u0e3f'},
 u'TWD': {u'15m': 20965.35,
          u'buy': 20965.35,
          u'last': 20965.35,
          u'sell': 20965.67,
          u'symbol': u'NT$'},
 u'USD': {u'15m': 652.7,
          u'buy': 652.7,
          u'last': 652.7,
          u'sell': 652.71,
          u'symbol': u'$'},
 u'baseVolume': u'71691.55099130',
 u'high': u'0.02070000',
 u'high24hr': u'0.02070000',
 u'highestBid': u'0.01957006',
 u'id': 148,
 u'isFrozen': u'0',
 u'last': u'0.01956700',
 u'low': u'0.01760000',
 u'low24hr': u'0.01760000',
 u'lowestAsk': u'0.01958372',
 u'percentChange': u'0.07570270',
 u'price': u'0.01956700',
 u'quoteVolume': u'3802775.62565674',
 u'volume': u'71691.55099130'}

读取页面中的javascript,1个以太币的价格为1 * data['price'] * data['EUR']['last']

>>> r = requests.get('http://ether.price.exchange/update')
>>> d = r.json()
>>> float(d['price']) * float(d['EUR']['last'])
11.562597087999999

【讨论】:

  • 值得注意的是,在撰写本文时,网站上似乎存在一个错误,即即使您从下拉列表中选择了不同的货币,定期更新的每种货币价值始终是美元计算。
  • 还是谢谢你!您从哪里看到数据来自 json blob?
  • 我猜会是这样,于是在 chrome 开发工具中寻找 XHR。
【解决方案2】:

我能够从另一个网页获得价值。代码如下所示:

def get_current_value(): chrome_path = r"C:\Users\Chris\Desktop\Chrome_driver\chromedriver.exe" driver = webdriver.Chrome(chrome_path) driver.get("https://cryptowatch.de/kraken/etheur") a = driver.find_element_by_xpath("""//*[@id="price-ticker"]""").text unicodedata.normalize("NFD",a)#.encode('ascii','ignore') return a

我在unicodedata.normalize("NFD",a)#.encode('ascii','ignore') 此处添加了这段代码,以将显然是 unicode 的输出转换为字符串。

我现在面临的问题是 a 的输出类似于:12.99 欧元
如何删除欧元符号以便将字符串转换为浮点数?

我必须将此作为答案发布,因为有人无缘无故地对我投了反对票,所以我今天不能再问另一个问题了..

【讨论】:

  • 我终于明白了!由于欧元符号始终是字符 0,我可以使用以下代码:a = float(a[1:])。没想到这么容易:)
猜你喜欢
  • 2015-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多