BeautifulSoup没有正确解析数据

时间:2018-01-10 23:59:55

标签: python beautifulsoup html-parsing

我正在尝试使用BeatifulSoup4和Python2.7.5解析this page。我的代码如下所示:

url = "https://coinmarketcap.com/currencies/CRYPTO/historical-data/?
      start=20171124&end=20171130"
url.replace('CRYPTO', crypto['id'])
response = urllib2.urlopen(url)

data = response.read()
soup = BeautifulSoup(data, 'html5lib')

trs = soup.find(id="historical-data").findAll('tr')

其中CRYPTO被“比特币”等替换

查看PyCharm中的变量,除了表中的数据外,一切看起来都很好。而不是看到这个:

<tr class="text-right">
<td class="text-left">Nov 30, 2017</td>
<td>9906.79</td>
<td>10801.00</td>
<td>9202.05</td>
<td>10233.60</td>
<td>8,310,690,000</td>
<td>165,537,000,000</td>
</tr>

这是Google Chrome的Inspect窗口和curl向我展示的内容,BeautifulSoup向我展示了这一点:

<tr class="text-right">
<td class="text-left">Nov 30, 2017</td>
<td>0.009829</td>
<td>0.013792</td>
<td>0.009351</td>
<td>0.013457</td>
<td>152</td>
<td>119,171</td>
</tr>

为什么数字不同?

我使用过urllib2和请求。我使用了response.text和response.read()。我使用lxml和html5lib进行了解析。我尝试了不同的编码,如iso-8859和ascii。什么都行不通。

如何显示正确的数字?

1 个答案:

答案 0 :(得分:2)

你需要做这样的事情:

url = "https://coinmarketcap.com/currencies/CRYPTO/historical-data/?
      start=20171124&end=20171130"
response = urllib2.urlopen(url.replace('CRYPTO', crypto['id']))

......或者更清楚地说明发生了什么:

url = "https://coinmarketcap.com/currencies/CRYPTO/historical-data/?
      start=20171124&end=20171130"
newurl = url.replace('CRYPTO', crypto['id'])
response = urllib2.urlopen(newurl)

...因为现在您的代码已经存在,url.replace('CRYPTO', crypto['id'])本身并没有改变任何内容;相反,它只是创建一个新的字符串,但从不对该新字符串做任何事情。

您的代码没有更改url字符串,因为这不是string.replace(…)的工作原理 - 而不是Python字符串的工作方式。

因此,当前代码发生的情况是,在您调用CRYPTO之前,不会替换URL中的urllib2.urlopen(…)子字符串。因此,您获得的结果来自此URL:

https://coinmarketcap.com/currencies/CRYPTO/historical-data/?start=20171124&end=20171130