為什麼這個網頁的源代碼用python爬下來後用beautifulsoup解析後會出現字元丟失?

我在學習爬蟲的時候,爬網頁里的url時出現了字元串丟失的問題:代碼如下:

import urllib2
from bs4 import BeautifulSoup
code = "sh600000"
i = 1
while True:
url = "http://vip.stock.finance.sina.com.cn/corp/view/vCB_AllNewsStock.php?symbol="+code+"Page="+str(i)
i = i+1
response = urllib2.urlopen(url).read()
soup = BeautifulSoup(response)

res = soup.find("div", attrs={"class": "datelist"})
if res == None:
break
ur = res.contents[0]
ur = list(ur)
ur = ur[:-1]
temp = unicode(ur[0])
for index in range(0, len(ur), 4):
temp = unicode(ur[index])
print temp.strip()
print ur[index+1].string
print ur[index+1]["href"]
print "
"

當爬到2015-04-13 01:00這篇文章的時候,出現了範圍溢出的情況,對單獨的網頁進行分析時發現當我執行soup = Beautifulsoup(response)時,然後print soup 發現有一段文字不見了。print response.decode("gbk").decode("utf-8")也出現了編碼錯誤。
查看原網頁是這樣一段字元串不見了:「招商基金管理有限公司關於招商豐泰靈活配置混合型證券投資基金(LOF)增加交通銀行、上海浦發銀行、平安銀行和光大銀行為代銷機?」。請問是為什麼?要改掉什麼。代碼渣渣。


又是你這個只點感謝不點贊的壞人……
話說你為什麼要這麼心急地學呢,基礎不紮實啊,太冒進了,很顯然沒有清晰的思路…

首先編程要有默認的編碼,也就是在文件的一開始加上

# -*- coding: utf-8 -*-

其次,你讀取到網頁的時候,需要查看網頁的編碼,雖然現在很多從開始學習web開發時就會告訴你要用utf-8編碼,但是很多以前的網頁顯然並不是。
比如你舉的這個例子。

你看他的編碼是 gb2312 所以你在response那一步的後面就應該進行decode了。

# -*- coding: utf-8 -*-
import urllib2
import codecs
from bs4 import BeautifulSoup
url = "http://finance.sina.com.cn/stock/t/20150413/010021937376.shtml"
response = urllib2.urlopen(url).read().decode("gb2312").encode("utf-8")
print response

然後你運行一下…會遇到這樣的情況。

這是什麼原因呢…你自己查吧。我只給你解決辦法。
頁面中可能有一些與我們指定的編碼方式不一樣的特殊字元,導致編碼失敗,可以將decode("gb2312")改為decode("gb2312","ignore") 這樣程序會自動忽略掉那些特殊字元。那些特殊的字元一般不會影響到我們想獲取的內容,至於那些特殊字元可能是什麼,自己查吧。
重新運行,這次應該就沒問題了。
另一種解決辦法是直接在decode的時候使用decode("gbk")
關於gb2312和gbk的區別你可以自己查一下。

當然另一些情況下面就算你使用了decode("gbk")依然會報錯,怎麼解決?很簡單啊,使用decode("gbk", "ignore")


問題解決。
另外你這次如果還是只點感謝不點贊以後就不答你的問題了,沒勁。


你是python2 代碼前 加上# coding:utf-8

看python培訓黃哥的三篇文章
python開發爬蟲漢字編碼不再是問題:
將python2中漢字會出現亂碼的事一次性說清楚
article/python_bianma.md at master · pythonpeixun/article · GitHub
python爬蟲訪問多個網站、中文編碼的處理。
python爬蟲訪問多個網站、中文編碼的處理。
python3訪問sina首頁中文的處理
python3訪問sina首頁中文的處理

可能在你這個轉來轉處的地方丟失。
ur = list(ur)
ur = ur[:-1]
****************

ur = res.contents[0]
ur = list(ur)
ur = ur[:-1]
temp = unicode(ur[0])
for index in range(0, len(ur), 4):
temp = unicode(ur[index])
print temp.strip()
print ur[index+1].string
print ur[index+1]["href"]
print "
"


似乎response 後面用了倆decode 後面一個改encode應該就好了吧。。。

Decode是把括弧里轉成Unicode

Encode是Unicode轉成括弧里,就是UTF-8

Unicode就是個中轉站

再不行就同一樓ignore。。。


還是用Requests庫來處理http請求吧


推薦閱讀:

目前做爬蟲,往後的職業發展方向是什麼?
python如何爬取字幕組網站的電影鏈接地址?
我該如何用PHP的cURL獲取這個奇葩的網頁內容?
使用python爬取pixiv.net的圖片?
關於scrapy的crawlspider?

TAG:Python | 爬蟲計算機網路 | beautifulsoup | Python入門 | 網頁爬蟲 |