BeautifulSoup无法正确解析<td>数据

3

我正在尝试使用Python2.7.5中的BeatifulSoup4解析此页面。我的代码如下:

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替换为'bitcoin'等。

在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的检查窗口和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和requests。我用response.text和response.read()。我用lxml和html5lib解析。我尝试过不同的编码,如iso-8859和ascii。但都没有成功。

我该如何正确显示数字?

1个回答

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字符串的工作方式。
所以,你当前的代码发生的情况是,在调用urllib2.urlopen(…)之前,URL中的CRYPTO子字符串没有被替换。因此,你得到的结果来自于这个URL: https://coinmarketcap.com/currencies/CRYPTO/historical-data/?start=20171124&end=20171130

谢谢你指出我的愚蠢。是的,我知道字符串不是这样工作的。只是其中一件事情... - faberfedor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接