1. 程式人生 > >[Python3填坑之旅]1、urllib模組網頁爬蟲訪問中文網址出錯

[Python3填坑之旅]1、urllib模組網頁爬蟲訪問中文網址出錯

正在學習網頁爬蟲,用的Python3+urllib模組,當遇到連結裡有中文字元的時候總是報錯。之前以為是Python編碼的問題,不斷去嘗試不同的編碼去encode與decode,可以問題總是解決不了,沒有辦法繼續查閱資料,最後發現其實解決方法特別簡單。

  • 問題描述
    當我訪問帶有中文字元的網址時總會報錯:
UnicodeEncodeError: 'ascii' codec can't encode characters in position 10-11: ordinal not in range(128)

最開始以為編碼問題,沒有解決
原始碼程式碼如下:

import urllib

rooturl = "https://baike.baidu.com/item/"
item = "爬蟲"
url = rooturl+item
print(url)

request = urllib.request.Request(url=url)
reponse = urllib.request.urlopen(request)
result = reponse.read()
result = str(result, encoding="utf-8")
print(result)
  • 解決方法
    最後找到了問題,就是應為中文“爬蟲”出的問題,卻不是編碼問題。
    原來是Python3的urllib模組urllib.request.Request()方法中無法處理帶有中文字元的連結,需要通過urllib.parse.quote()對中文字串轉換一下新增程式碼即可:
item = urllib.parse.quote(item)

但是要注意一點,只要對中文部分進行轉換,如果連結全部轉換也會報錯:

ValueError: unknown url type: 'https%3A//baike.baidu.com/item/%E7%88%AC%E8%99%AB'

完整程式碼:

import urllib

rooturl = "https://baike.baidu.com/item/"
item = "爬蟲"
item = urllib.parse.quote(item)
url = rooturl+item
print(url)

request = urllib.request.Request(url=url)
reponse = urllib.request.urlopen(request)
result = reponse.read()
result = str(result, encoding="utf-8")
print(result)

今天又踩了這個坑,我把它填平了,希望後來者路平攤些
謝謝觀看