requests模塊的response.text與response.content有什麼區別?

我發現在這段代碼裡面response.text顯示的是亂碼,而response.content是正常的

from bs4 import BeautifulSoup
import requests

url = "散文詩詞-頂點小說"
response = requests.get(url)
print response.text
print response.content
url_list = []
tds = BeautifulSoup(response.content,"lxml").find("table").find_all("tr",bgcolor="#FFFFFF")
for td in tds:
novlename = td.find_all("a")[1].get_text()
novleurl = td.find_all("a")[0]["href"]
url_list.append(novleurl)

print str(novlename.encode("gb2312")) #這裡面encode成utf8或者GBK都是對的。
print url_list

#以下是在Scrapy中的由於Scrapy中的Request模塊沒有response.content現在不知道怎麼解決亂碼的問題novlename是亂碼。。。
import re
import scrapy
from bs4 import BeautifulSoup
from scrapy.http import Request
from ScrapyExample1.items import Scrapyexample1Item

class ScrapyExample1Spider(scrapy.Spider):
name = "ScrapyExample1Spider"
allowed_domains = ["23us.com"]
bash_url = "http://www.23us.com/class/"
bashurl = ".html"

def start_requests(self):
for i in range(1,11):
url = self.bash_url + str(i) + "_1" + self.bashurl
yield Request(url,self.parse)
yield Request("http://www.23us.com/quanben/1", self.parse)

def parse(self,response):
print(response.text)
print response.content
max_num = BeautifulSoup(response.text,"lxml").find("div",class_="pagelink").find_all("a")[-1].get_text()
base_url = (response.url)[:-7]
for i in range(1,int(max_num)+1):
final_url = base_url + "_" + str(i) + self.bashurl
yield Request(final_url,self.get_name)

def get_name(self,response):
#name = BeautifulSoup(response.text,"lxml").find("table").find("a")[-1].get_text()
#novleurl = BeautifulSoup(response.text,"lxml").find("table").find("a")[-1]["href"]
tds = BeautifulSoup(response.text,"lxml").find_all("tr",bgcolor="#FFFFFF")
for td in tds:
novlename = td.find_all("a")[1].get_text()
novleurl = td.find_all("a")[0]["href"]
yield Request(novleurl,self.get_chapterurl,meta={"name":novlename,"url":novleurl})

但是Scrapy中調用Request模塊又不能用content,有什麼辦法可以解決呢?


簡單來講,requests.content返回的是二進位響應內容

而requests.text則是根據網頁的響應來猜測編碼,如果伺服器不指定的話,默認編碼是"

ISO-8859-1"(我當初看到這裡的時候,在想為啥默認編碼不設置為utf8呢,然後看到了原來是http協議是這樣的,所以...)所以這是為什麼你用 response.text 返回的是亂碼的原因。

你可以用response.encoding看一下他猜測的編碼是啥。我猜應該是ISO-8859-1

然後你用response.encoding = "utf-8"

然後再 response.text ,返回的內容應該是正常的了.

&>&>&> r.encoding
"utf-8"
&>&>&> r.encoding = "ISO-8859-1"

看如下截圖,我有聲明編碼為utf8,則response.text會用utf8來解碼


請看區別


簡單說就是:

  • resp.text返回的是Unicode型的數據。
  • resp.content返回的是bytes型也就是二進位的數據。

如果你想取文本,可以通過r.text。
如果想取圖片,文件,則可以通過r.content。


(resp.json()返回的是json格式數據)

# 例如下載並保存一張圖片
import requests
jpg_url = "http://img2.niutuku.com/1312/0804/0804-niutuku.com-27840.jpg"
content = requests.get(jpg_url).content
with open("demo.jpg", "wb") as fp:
fp.write(content)


In [3]: from bs4 import BeautifulSoup
...: import requests
...:
...: url = "http://www.23us.com/class/9_11.html"
...: response = requests.get(url)
...: response.encoding = response.apparent_encoding

編碼的問題, 你可以自己指定編碼或者使用response.apparent_encoding 來指定.

scrapy 自動解碼正常


我注意到requests.get(url).text的內容,與Beautifulsoap(requests.get(url).text, "lxml")或者Beautifulsoap(requests.get(url).content, "lxml") 內容都一樣,是否意味著requests.get(url).text 已經可以直接用來處理,而無需Beautifulsoap 繼續解析?


推薦閱讀:

Python如何輸出包含在對象中的中文字元?
vim怎麼匹配多個相同字元並替換成字元加數字遞增的形式?
如何避免無意識裝B?
win8環境下python3.4怎麼樣配置才能把scrapy安裝成功?

TAG:Python | 爬蟲計算機網路 | scrapy | requests |