Как можно очистить страницу, которая буквально содержит "\ x2d", но сохранить этот символ как "-" в моем элементе? - PullRequest
0 голосов
/ 29 марта 2019

Мне нужно очистить некоторый текст из сценария на странице и сохранить этот текст в элементе Scrapy, предположительно, в виде строки UTF-8. Однако фактический буквальный текст, который я вычеркиваю, содержит специальные символы, написанные как то, что я считаю гексом UTF. например «-» записывается как «\ x2f». Как я могу очистить символы, представленные как "\ x2f", но сохранить их как "-" в моем элементе Scrapy?

Выдержка из содержимого на очищенной странице:

<script type="text/javascript">

[approx 100 various lines of script, omitted]

"author": "Kurt\x20Vonnegut",
"internetPrice": "799",
"inventoryType": "new",
"title": "Slaughterhouse\x2DFive",
"publishedYear": "1999",

[approx 50 additional various lines of script, removed]

</script>

Мой сценарий написан так:

pattern_title = r'"title": "(.+)"'
title_raw = response.xpath('//script[@type="text/javascript"]').re(pattern_title)
item['title'] = title_raw[0]

Для этого элемента вывод скрапы будет возвращаться:

'author': u'Kurt \ x20Vonnegut ',' title ': u'Slaughterhouse \ x2DFive'

В идеале я бы хотел:

'author': 'Kurt Vonnegut', 'title': 'Slaughterhouse Five'

Вещи, которые я пробовал, без изменений в выводе:

  • Изменить последнюю строку на: item ['title'] = title_raw [0] .decode ('utf-8')
  • Изменить последнюю строку на: item ['title'] = title_raw [0] .encode ('latin1'). Decode ('utf-8')

Наконец, в случае, если это необходимо явно указать, я не могу контролировать, как эта информация отображается на очищаемом сайте.

Ответы [ 2 ]

1 голос
/ 02 апреля 2019

Вдохновленный Преобразованием \ x экранированной строки в UTF-8 , я решил это с помощью .decode ('string-escape'), как показано ниже:

pattern_title = r'"title": "(.+)"'
title_raw = response.xpath('//script[@type="text/javascript"]').re(pattern_title)
title_raw[0] = title_raw[0].decode('string-escape')
item['title'] = title_raw[0]
0 голосов
/ 29 марта 2019

Вы можете использовать функцию unquote urllib .

На Python 3.x:

from urllib.parse importe unquote
unquote("Kurt\x20Vonnegut")

На Python 2.7 :

from urllib import unquote
unquote("Kurt\x20Vonnegut")

Обратите внимание на Загрузчики элементов и Процессоры ввода , так что вы можете сделать это для всех очищенных полей.

...