使用binascii.unhexlify时如何解析找到的非十六进制数字

时间:2019-04-04 19:41:10

标签: python python-3.x web-scraping python-requests binascii

这似乎已经被问过好几次了,而我发现的解决方案似乎都不适用。请参阅参考文献

我已经使用requests生成了一个字符串(响应的.text),从中我正则表达式希望(在这种情况下有用)进行正则表达式传递给json()。为此,我需要处理正则表达式组1匹配中存在的十六进制数。

如果始终是固定的十六进制数集,则可以执行简单的替换,但我想我会尝试作者here的几个功能。实际上,请使用正则表达式匹配和binascii.unhexlify将所有十六进制匹配从输入字符串转换为ascii。

我的MCVE代码失败,并显示以下错误:

----> 8     return binascii.unhexlify(s)
      9 
     10 def reformat_content(data):

Error: Non-hexadecimal digit found

通过阅读下面显示的链接中的问题,我检查了我是否有一个字符串,其中没有尾随空格/换行符(最初在第1组上使用strip()是为了以防万一)。我继续打印匹配项以验证存在的内容:

p = re.compile(r'\\x(\w{2})')
items = set(re.findall(p, data))
print(items)

此返回:

{'20', '2F', '3D', '29', '3F', '3A', '28'}

没有问题,因为那很简单:

{' ', '(', ')', '/', ':', '=', '?'}

那么,有人可以帮助我找到此错误的来源和解决方法吗?

我从bug report中注意到,错误也可以作为考虑因素。

以下重现问题的代码。

注意:我在思考今天发布的question时遇到了这个问题。我不认为这是骗人的,因为我对十六进制问题感兴趣,而不是那里提出的解决方案。


代码:

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. Can't convert to HEX - TypeError: Non-hexadecimal digit found

  2. Convert hexadecimal to normal string

  3. Python - binascii.unhexlify and .decode("hex") return TypeError: Non-hexadecimal digit found

0 个答案:

没有答案