Как найти не шестнадцатеричные цифры, найденные при использовании binascii.unhexlify - PullRequest
0 голосов
/ 04 апреля 2019

Похоже, что этот вопрос уже задавался несколько раз, и ни одно из найденных мной решений не подходит. см. Ссылки

Я использовал 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)

Ссылки:

  1. Невозможно преобразовать в HEX - TypeError: Найдена не шестнадцатеричная цифра

  2. Преобразование шестнадцатеричной в обычную строку

  3. Python - binascii.unhexlify и .decode ("hex") возвращают TypeError: Non-найдено шестнадцатеричное число

...