这似乎已经被问过好几次了,而我发现的解决方案似乎都不适用。请参阅参考文献
我已经使用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)
参考: