Python BS4没有在find_all()函数中返回Unicode值

时间:2017-06-24 17:53:18

标签: python python-2.7 unicode python-requests bs4

对于一个学校项目,我想编写一个python程序,从这个网站中提取比特币的当前值:http://www.coindesk.com/price/。为此,我安装了BeautifulSoup4和Requests库,以便提取HTML数据并解析它,但是当实际获得价格的时候,我的程序什么都不返回。这是我想要获得的picture。这是我的代码:

import requests as r
from bs4 import BeautifulSoup as bs
doc = r.get("http://www.coindesk.com/price/")
soup = bs(doc.content, "html.parser")
price = soup.find_all("a", {"class":"bpiUSD"})
text = []
contents = []
for item in price:
    text.append(item.text)
for item in price:
    contents.append(item.contents)
print "text:", type(text[0])
print "contents:", type(contents[0])
print "text[0]:", text[0]
print "contents[0]", contents[0]

这是输出:

text: <type 'unicode'>
contents: <type 'list'>
text[0]: 
contents[0] []

我用这种方式获取字符串和数字并且它有效但是当它达到这个特定数字时它没有返回任何内容。此外,我知道比特币的价格是用Unicode(至少我假设这个),我试图将其转换为字符串值,但是尽管.type()函数确实提到列表是Unicode,但没有任何效果。

2 个答案:

答案 0 :(得分:0)

您要么必须找到其他网站,要么使用selenium webdriver。价格是由请求不执行的javascript生成的。

from bs4 import BeautifulSoup as bs

doc = r.get("http://www.coindesk.com/price/")
soup = bs(doc.content, "lxml")
price = soup.find_all(class_="currency-price")
print(price)

打印:

[<div class="currency-price">
<a class="bpiUSD" href="/price/" style="color:white;"></a>
</div>, <div class="currency-price">
<a class="bpiUSD" href="/price/" style="color:white;"></a>
</div>]

哪个不包含您的号码。如果您检查网站上的html,它将具有a标签之间的数字。使用像selenium这样的库可以让你运行javascript。

答案 1 :(得分:0)

您尝试使用Beautiful soup解析的网站正在通过javascript调用呈现,这些调用正在从数据的api发布json中获取数据,即coindesk api。这就是你美丽的汤调用不起作用的原因。

要获取此数据,您需要使用请求请求json,然后迭代到您需要的数据。

我在下面的脚本中为您完成了该过程。我添加了注释,以便您了解我在每个部分中所做的工作。它可以用更少的代码行完成,但我认为这有助于你更好地理解如何遍历json。

这是在python 3中,如果你想在python2.7中输出更漂亮的话,删除print语句周围的括号。

axios