当使用第三方库requests
的时候,可以这样转换:
import requests
html = requests.get('http://example.com')
html.encoding = 'utf-8'
问题:
使用Scrapy中的Request的时候,怎么把拿到的内容编码转换为utf-8?
demo:
import scrapy
class StackOverflowSpider(scrapy.Spider):
name = 'stackoverflow'
start_urls = ['http://stackoverflow.com/questions?sort=votes']
def parse(self, response):
for href in response.css('.question-summary h3 a::attr(href)'):
full_url = response.urljoin(href.extract())
yield scrapy.Request(full_url, callback=self.parse_question)
def parse_question(self, response):
yield {
'title': response.css('h1 a::text').extract_first(),
'votes': response.css('.question .vote-count-post::text').extract_first(),
'body': response.css('.question .post-text').extract_first(),
'tags': response.css('.question .post-tag::text').extract(),
'link': response.url,
}
Cuba menjawab soalan anda, saya rasa pemahaman anda tentang pengekodan python agak tersasar.
1. Kedua-dua permintaan dan permintaan hanyalah pakej pelaksanaan protokol http.
Pengekodan mesej pemulangan paket datang daripada tapak web yang dilawati oleh protokol HTTP Format pengekodan akan ditulis dalam pengepala protokol http.
Contohnya, kod berikut:
r=requests.get('http://www.baidu.com')
print r.headers['Content-Type']
Output:
text/html;charset=UTF-8
Ini menunjukkan format UTF-8 bagi mesej respons.
Begitu juga dengan scrapy.Request.
2. Jika charset yang dikembalikan=gbk2312, anda boleh menentukan sama ada untuk menukar kodnya ke dalam pengekodan yang anda perlukan berdasarkan keperluan kod anda.
r=requests.get('http://www.baidu.com')
print r.content[:1000].decode('utf-8')
print r.content[: 1000].decode('utf-8').encode('gbk')
Hanya gunakan nyahkod dan pengekodan, tidak kira sama ada ia buruk atau tidak.