首頁  >  問答  >  主體

python - beautifulsoup解析中文网页的编码问题

对于同一个页面,几乎同样的代码,在Python3,windows8环境下能够正常解析运行。但是把代码移植到Ubuntu,Python2.7下面之后,会出现获取的网页不能被beautifulsoup解析,find_all('table')返回空节点的情况。
出问题的代码的一部分(可以运行):

python#coding:utf-8
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
import urllib2
from bs4 import BeautifulSoup
postdata = "T1=&T2=1&T3=&T4=&T5=&APPDate=&T7=&T8=&T9=&PRDate=&T11=&SQDate=&JDDate=&T14=&T15=&T16=&T17=&SDDate=&T19=&T20=&T21=&D1=%B8%B4%C9%F3&D2=jdr&D3=%C9%FD%D0%F2&C1=fm&C2=&C3=&page=70"
postdata = postdata.encode('utf-8')
headers = {'User-Agent':'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6','Referer':'http://app.sipo-reexam.gov.cn/reexam_out/searchdoc/searchfs.jsp'}
req = urllib2.Request(
      url = "http://app.sipo-reexam.gov.cn/reexam_out/searchdoc/searchfs.jsp",
      headers = headers,
      data = postdata)
fp  = urllib2.urlopen(req)
mybytes = fp.read().decode('gbk').encode('utf-8')
soup = BeautifulSoup(mybytes,from_coding="uft-8")
print soup.original_encoding
print soup.prettify()

求指点一二

大家讲道理大家讲道理2717 天前340

全部回覆(2)我來回復

  • 阿神

    阿神2017-04-17 14:28:52

    有沒有嘗試過換一個解析器。
    python2.7的html解析器容錯率很差。
    推薦lxml。

    回覆
    0
  • 大家讲道理

    大家讲道理2017-04-17 14:28:52

    呃,這主要是程式設計問題。 。 。 python的encoding問題沒搞懂絕對是個大坑。
    我看到這幾句話,好像都有點問題:

    1. mybytes = fp.read().decode('gbk').encode('utf-8')
    2. soup = BeautifulSoup(mybytes,from_coding="uft-8")
    3. print soup.original_encoding
    4. print soup.prettify()

    其中,

    1. 不需要編碼轉換,bs可以接受任何編碼,unicode更好。所以即使編碼轉換也應該只到decode就夠了

    2. bs實例建構用法是BeautifulSoup(html, 'html5lib'),第二個參數是解釋器,而不是編碼。

    3. 直接print soup就能出結果啦,顯不顯示中文主要和編碼有關,bs的編碼轉換能力其實還是不那麼強的,所以明文調用也會出問題

    4. soup.prettify('utf-8')這樣的才能保證輸出的編碼正確。

    回覆
    0
  • 取消回覆