Как преобразовать CSS выделенное поле в обычную строку python - PullRequest
0 голосов
/ 27 мая 2020

Мой проект scrapy дает мне странную кодировку для элементов при использовании селекторов CSS.

Вот соответствующий код:

После того, как запрос scrapy сделан и веб-страница загружена , parse_page вызывается с ответом ...

    def parse_page(self, response):

        # Using Selenium WebDriver to select elements
        records = self.driver.find_elements_by_css_selector('#searchResultsTable > tbody > tr')

        for record in records:

            # Convert selenium object into scrapy.Selector object (necessary to use .add_css methods)  
            sel = Selector(text=record.get_attribute('outerHTML'))

            # Instantiate RecordLoader (a custom item loader)
            il = RecordLoader(item=Record(), selector=sel)

            # Select element and pass to example_field's input processor
            il.add_css('example_field', 'td:nth-child(2) > a::text')

il.add_css() передает результат селектора CSS процессору ввода example_field, который для демонстрационных целей является только операторами печати и показывает проблему ...

def example_field_input_processor(text_html):
    print(text_html)
    print(type(text_html))
    print(text_html.encode('utf-8'))

Вывод:

'\xa0\xa004/29/2020 10:50:24 AM,\xa0\xa0\xa0'

<class 'str'>

b'\xc2\xa0\xc2\xa004/29/2020 10:50:24 AM,\xc2\xa0\xc2\xa0\xc2\xa0'

Вот мои вопросы:

1) Почему селектор CSS не просто дал мне обычную строку Python? Связано ли это с преобразованием селектора CSS в текст с ::text. Это потому, что веб-страница имеет другую кодировку? Я проверил, есть ли тег <meta>, указывающий кодировку сайта, но его не было.

2) Когда я принудительно кодирую 'utf-8', почему я не получаю нормальный python строка вместо строки байтов, которая показывает все символы Юникода?

3) Моя цель - иметь обычную строку python (без добавления b, без странных символов), которую я могу разобрать. Как?

1 Ответ

1 голос
/ 28 мая 2020

При парсинге вам иногда приходится очищать результаты от символов Юникода

Обычно это результат spaces tabs, а иногда span

Как правило, чистка все тексты, которые вы очищаете:

def string_cleaner(rouge_text):
    return ("".join(rouge_text.strip()).encode('ascii', 'ignore').decode("utf-8"))

Объяснение:

Используйте split() и join, чтобы перевести символы и очистить их от юникодов.

Эта часть кода "".join(rouge_text.strip())

Затем закодируйте его в ascii и декодируйте в utf-8, чтобы удалить специальные символы

Эта часть кода .encode('ascii','ignore').decode("utf-8"))

Как бы вы применили его в своем коде

print(string_cleaner(text_html))

...