Похоже, что этот вопрос уже задавался несколько раз, и ни одно из найденных мной решений не подходит. см. Ссылки
Я использовал requests
для получения строки (.text
ответа), из которого у меня есть regex'd (полезно в данном случае) из строки, которую я хочу передать json()
.Для этого мне нужно обработать несколько шестнадцатеричных чисел, присутствующих в совпадении с группой регулярных выражений 1.
Если бы это всегда был фиксированный набор шестнадцатеричных чисел, я мог бы сделать простую замену, но я подумал, чтопопробовал бы пару функций автора здесь .По сути, используйте регулярные выражения и binascii.unhexlify
для преобразования всех шестнадцатеричных совпадений из входной строки в ascii.
Мой код MCVE завершается с ошибкой:
----> 8 return binascii.unhexlify(s)
9
10 def reformat_content(data):
Error: Non-hexadecimal digit found
Из чтения вопросов впо ссылкам, показанным ниже, я проверил, что у меня есть строка, в которой нет пробелов / пробелов (изначально использовались strip()
в моей группе 1 на всякий случай).Я продолжал печатать спички, чтобы проверить, что присутствовало:
p = re.compile(r'\\x(\w{2})')
items = set(re.findall(p, data))
print(items)
Это вернуло:
{'20', '2F', '3D', '29', '3F', '3A', '28'}
Нет проблем, так как это просто:
{' ', '(', ')', '/', ':', '=', '?'}
Итак, кто-нибудь может мне помочь найти источник и разрешение этой ошибки?
Я отмечаю из этого отчета об ошибке , что ошибка также может быть рассмотрена.
Код для воспроизведения проблемы ниже.
Примечание: я сталкивалсяэта проблема, думая об этом вопрос , опубликованном сегодня.Я не считаю это обманом, потому что меня интересует шестнадцатеричная проблема, а не решение, запрошенное там.
Код:
import re
import requests
import binascii
def asciirepl(match): # http://love-python.blogspot.com/2008/05/convert-hext-to-ascii-string-in-python.html
# replace the hexadecimal characters with ascii characters
s = match.group()
return binascii.unhexlify(s)
def reformat_content(data):
p = re.compile(r'\\x(\w{2})')
return p.sub(asciirepl, data)
headers = {'user-agent' : 'Mozilla/5.0'}
r = requests.get('https://www.transfermarkt.com/kevin-de-bruyne/marktwertverlauf/spieler/88755', headers = headers)
data = re.search(r"'series':\[(.*),'credits", r.text ,flags=re.DOTALL).group(1)
data = reformat_content(data)
Ссылки:
Невозможно преобразовать в HEX - TypeError: Найдена не шестнадцатеричная цифра
Преобразование шестнадцатеричной в обычную строку
Python - binascii.unhexlify и .decode ("hex") возвращают TypeError: Non-найдено шестнадцатеричное число