為什麼這個網頁的源代碼用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入門 | 網頁爬蟲 |