Некоторые "необычные символы" закодированы неправильно при очистке с помощью Scrapy - PullRequest
0 голосов
/ 04 июля 2019

Я использовал Scrapy для получения данных фильмов, но некоторые из них имеют специальные символы, которые закодированы неправильно.

Например, есть фильм, на котором есть ссылка на веб-сайте: Покемон: детектив Пикачу

Конфликт с символом "é" при получении названия фильма.

Все данные добавляются в файл json с помощью команды терминала «scrapy crawl movie -o movies.json»

Если в файле settings.py Scrapy указано не FEED_EXPORT_ENCODING, слово Покемон записывается в файл json как "Pok\u00e9mon"

Если используется FEED_EXPORT_ENCODING = 'utf-8', имя записывается как "Pokà © mon"

Метод разбора в пауке выглядит следующим образом:

def parse(self, response):

    base_link = 'http://www.the-numbers.com'
    rows_in_big_table = response.xpath("//table/tr") 

    movie_name = onerow.xpath('td/b/a/text()').extract()[0]

    movie_item['movie_name'] = movie_name

    yield movie_budget_item

    next_page = 
    response.xpath('//div[@class="pagination"]/a[@class="active"]/following- 
    sibling::a/@href').get()

    if next_page is not None:
        next_page = response.urljoin(next_page)
        yield scrapy.Request(next_page, callback=self.parse)

В качестве дополнительной информации у меня есть информация о файле json, где информация анализируется:

<_io.TextIOWrapper name='movie.json' mode='r' encoding='cp1252'>

Цель состоит в том, чтобы получить символ "é" в слове "Pokémon".

Как бы вы решили эту проблему и почему это происходит, я читал много информации о кодировании и в документации по Python, но я могу найти решение.

Я также пытался использовать "unicodedata.normalize('NFKC', 'Pok\u00e9mon')", но безуспешно.

Я ценю вашу помощь! Спасибо, ребята!

1 Ответ

1 голос
/ 04 июля 2019

Использовать кодировку ISO-8859-1

import scrapy
from bad_encoding.items import BadEncodingItem


class MoviesSpider(scrapy.Spider):
    name = 'movies'
    allowed_domains = ['www.the-numbers.com']
    start_urls = [
        'https://www.the-numbers.com/box-office-records/domestic/all-movies/cumulative/all-time/301'
    ]

    custom_settings = {'FEED_EXPORT_ENCODING': 'ISO-8859-1'}

    def parse(self, response):
        for row in response.xpath('//table/tbody/tr'):
            items = BadEncodingItem()
            items['Rank'] = row.xpath('.//td[1]/text()').get()
            items['Released'] = row.xpath('.//td[2]/a/text()').get()
            items['Movie'] = row.xpath('.//td[3]/b/a/text()').get()
            items['Domestic'] = row.xpath('.//td[4]/text()').get()
            items['International'] = row.xpath('.//td[5]/text()').get()
            items['Worldwide'] = row.xpath('.//td[6]/text()').get()

            yield items

И это мой файл json

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...