Большое спасибо за ваши ответы, Джон и Стивен.Ваши ответы заставили меня задуматься по-другому, что привело меня к поиску источника проблемы, а также рабочего решения.
Я работал со следующим тестовым кодом:
import urllib
import urllib2
from scrapy.selector import HtmlXPathSelector
from scrapy.http import HtmlResponse
URL = "http://jackjones.bestsellershop.com/DE/jeans/clark-vintage-jos-217-sup/37246/37256"
url_handler = urllib2.build_opener()
urllib2.install_opener(url_handler)
handle = url_handler.open(URL)
response = handle.read()
handle.close()
html_response = HtmlResponse(URL).replace(body=response) # Problematic line
hxs = HtmlXPathSelector(html_response)
desc = hxs.select('//span[@id="attribute-content"]/text()')
desc_text = desc.extract()[0]
print desc_text
print desc_text.encode('utf-8')
Внутри оболочки Scrapy, когда я извлек данные описания, все получилось нормально.Это дало мне повод предположить, что что-то не так в моем коде, потому что в подсказке pdb
я видел заменяющие символы в извлеченных данных.
Я просмотрел документы Scrapy для класса Response и скорректировал приведенный выше код так:
import urllib
import urllib2
from scrapy.selector import HtmlXPathSelector
from scrapy.http import HtmlResponse
URL = "http://jackjones.bestsellershop.com/DE/jeans/clark-vintage-jos-217-sup/37246/37256"
url_handler = urllib2.build_opener()
urllib2.install_opener(url_handler)
handle = url_handler.open(URL)
response = handle.read()
handle.close()
#html_response = HtmlResponse(URL).replace(body=response)
html_response = HtmlResponse(URL, body=response)
hxs = HtmlXPathSelector(html_response)
desc = hxs.select('//span[@id="attribute-content"]/text()')
desc_text = desc.extract()[0]
print desc_text
print desc_text.encode('utf-8')
Я сделал замену строки html_response = HtmlResponse(URL).replace(body=response)
с html_response = HtmlResponse(URL, body=response)
.Насколько я понимаю, метод replace()
каким-то образом исказил специальные символы с точки зрения кодирования.
Если кто-то захочет вникнуть в какие-либо подробности того, что именно метод replace()
сделал неправильно,Я был бы очень признателен за усилия.
Еще раз спасибо.