我有一个解析HTML代码的函数,因此很容易阅读和编写。为了做到这一点,我必须用多个分隔符分割字符串,你可以看到我使用re.split()
,我找不到更好的解决方案。但是,当我提交一些像this这样的HTML时,它绝对没有效果。这让我相信我的正则表达式写得不正确。那应该是什么?
def parsed(data):
"""Removes junk from the data so it can be easily processed."""
data = str(data)
# This checks for a cruft and removes it if it exists.
if re.search("b'", data):
data = data[2:-1]
lines = re.split(r'\r|\n', data) # This clarifies the lines for writing.
return lines
如果你发现类似的问题,这不是重复的,我已经爬了好几年了,但它仍然不起作用。
答案 0 :(得分:2)
您正在将bytes
值转换为字符串:
data = str(data)
# This checks for a cruft and removes it if it exists.
if re.search("b'", data):
data = data[2:-1]
表示所有行分隔符都已转换为Python转义码:
>>> str(b'\n')
"b'\n'"
这是一个文字b
,字面引用,文字\
反斜杠,文字n
,字面引用。您必须在r'(\\n|\\r)'
上进行拆分,但最重要的是,您不应在此处将字节值转换为字符串表示形式。 Python将字节值的表示生成为可以粘贴回Python解释器的文字字符串,这与对象中包含的值不同。 / p>
您希望将解码改为字符串:
if isinstance(data, bytes):
data = data.decode('utf8')
我假设数据是用UTF8编码的。如果这是来自Web请求的数据,则响应标头通常包含用于对Content-Type
标头中的数据进行编码的字符集,请查找charset=
参数。
urllib.request
模块生成的响应具有.info()
方法,并且可以提取字符集(如果提供):
charset = response.info().get_param('charset')
如果没有提供字符集,则返回值为None
。
您不需要使用正则表达式来分割线条,str
类型有专门的方法,str.splitlines()
:
返回字符串中的行列表,在行边界处断开。此方法使用通用换行符方法来拆分行。除非给出了keepends并且为true,否则换行符不会包括在结果列表中。
例如,
'ab c\n\nde fg\rkl\r\n'.splitlines()
会返回['ab c', '', 'de fg', 'kl']
,而splitlines(True)
的同一回复会返回['ab c\n', '\n', 'de fg\r', 'kl\r\n']
。