requests模塊的response.text與response.content有什麼區別?
我發現在這段代碼裡面response.text顯示的是亂碼,而response.content是正常的
from bs4 import BeautifulSoup
import requestsurl = "散文詩詞-頂點小說"
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 Scrapyexample1Itemclass 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安裝成功?