如何使用Python从HTML数据中提取JSON数据?
我正在尝试制作一个python脚本,可以读取outlook电子邮件中的JSON数据。但问题是如何从HTML数据中提取JSON数据。这是我想要提取的原始JSON数据如何使用Python从HTML数据中提取JSON数据?,python,html,json,regex,Python,Html,Json,Regex,我正在尝试制作一个python脚本,可以读取outlook电子邮件中的JSON数据。但问题是如何从HTML数据中提取JSON数据。这是我想要提取的原始JSON数据 { "vpn_detail": { "username":"harnishs", "tokens": [ "85188605", "00422786", ],
{
"vpn_detail":
{
"username":"harnishs",
"tokens":
[
"85188605",
"00422786",
],
"cluster_name":"*******.com"
}
}
所以我在outlook中使用imaplib读取了我的JSON数据,但它是在HTML中读取JSON数据的。所以这个JSON数据被转换成HTML,它的读取outlook电子邮件是这样的(以HTML形式)
所以这个代码给了我这个结果
b'
<!--P{margin-top:0;margi=
n-bottom:0;}-->
{
"vpn_detail":
{
"username":"harnishs&q;=
uot;,
"tokens": =
;
[
=
;"85188605",
=
;"00422786",
=
;"94548619",
=
;
],
"cluster_name":"***********.com"
}
}
'
b'
{
“vpn_详细信息”:
{
“用户名”:“Harnish&q=
uot
“代币”:=
;
[
=
;"85188605",
=
;"00422786",
=
;"94548619",
=
;
],
“群集名称”:“************.com”
}
}
'
但我希望这些数据与输入的JSON数据相同,但仍然没有精确的挖掘。请建议我进行任何更改,以便我可以通过电子邮件获得相同的JSON数据。您可以使用
html2text
库大大简化您的任务,该库几乎可以完成所有工作,您只需要删除不必要的标点符号并替换乱七八糟的引号用实数标记“
:
导入re、json、html2text
MyStr=b'\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n{
\r\n“vpn\u详细信息”:
\r\n{
\r\n“用户名”:“kushpate&q=\r\n=\r\n,
\r\n”令牌“:
- 您的输入字符串是一个字节字符串,您需要将其转换为Unicode UTF8字符串,因此,
是必需的MyStr.decode(“UTF8”)
将清除字符串中的HTML,您将立即获得JSONhtml2text.html2text(MyStr.decode(“utf8”))
删除所有出现的re.sub(r'(&q;=\s*uot;)|=\s*;\s*,lambda x:“'if x.group(1)else”“,MyStrTxt)
=代码>之间有空格(如果有),或将替换
&q=代码>+零个或多个空格+
uot代码>带有一个真正的
字符“
&q;=
标记…尝试re.search(r'{\s*“\w+”*},soup.text.strip().decode(“utf8”),re.s.group()
@WiktorStribiżew是的,我的输出得到了改进,但仍然没有得到确切的JSON数据。我想从用户名中删除这一行(&q;=uot;),现在我的输出是这样的,```{“vpn_详细信息”:{“username”:“harnish&q;=uot;,“tokens=”;[=;“85188605”,“00422786”,=;“94548619”,“51249494”,“HHEF0EA5”,“2E09A81E”],“集群名称”:“bgl13-=vpn-cluster-2.cisco.com”}```re.search(r'{\s*“\w+”*”,s.decode(“UTF8”),re.s.group().strip()。替换('&q;=\nuot;“,”)
?换行符总是在=
之后出现吗?谢谢@WiktorStribizew的回答,但我不想手动删除,因为每次我使用python阅读电子邮件时,这些JSON数据都会不同,但格式相同,所以我的问题是如何从HTML数据中获取相同的JSON数据。您的代码只给出了答案[kushpate]我想要完整的JSON数据。@Harnishhahprint(js)
。请玩转这些代码。你感兴趣的任何变量都很容易print()
。是的,它正在工作。感谢@Wiktor提供最佳解决方案。
from bs4 import BeautifulSoup
MyStr =""" HTML data """
soup = BeautifulSoup(MyStr, "html.parser")
print(soup.text.strip().replace(" ", ""))
b'
<!--P{margin-top:0;margi=
n-bottom:0;}-->
{
"vpn_detail":
{
"username":"harnishs&q;=
uot;,
"tokens": =
;
[
=
;"85188605",
=
;"00422786",
=
;"94548619",
=
;
],
"cluster_name":"***********.com"
}
}
'
import re, json, html2text
MyStr = b'<html>\r\n<head>\r\n<meta http-equiv=3D"Content-Type" content=3D"text/html; charset=3Diso-8859-=\r\n1">\r\n<style type=3D"text/css" style=3D"display:none;"><!-- P {margin-top:0;margi=\r\nn-bottom:0;} --></style>\r\n</head>\r\n<body dir=3D"ltr">\r\n<div id=3D"divtagdefaultwrapper" dir=3D"ltr" style=3D"font-size: 12pt; colo=\r\nr: rgb(0, 0, 0); font-family: Calibri, Helvetica, sans-serif, "EmojiFo=\r\nnt", "Apple Color Emoji", "Segoe UI Emoji", NotoCo=\r\nlorEmoji, "Segoe UI Symbol", "Android Emoji", EmojiSymb=\r\nols;">\r\n<p style=3D"margin-top:0; margin-bottom:0"></p>\r\n<div>\r\n<div>{<br>\r\n"vpn_detail":<br>\r\n {<br>\r\n "username":"kushpate&q=\r\nuot;, <br>\r\n "tokens":  =\r\n;<br>\r\n [<br>\r\n  =\r\n;"85188605",<br>\r\n  =\r\n;"00422786",<br>\r\n  =\r\n;"94548619",<br>\r\n  =\r\n;"51249494",<br>\r\n  =\r\n;"HHEF0EA5",<br>\r\n  =\r\n;"2E09A81E"<br>\r\n ],<br>\r\n "cluster_name":"bgl13-=\r\nvpn-cluster-2.cisco.com"<br>\r\n }<br>\r\n<br>\r\n}</div>\r\n</div>\r\n<br>\r\n<p></p>\r\n</div>\r\n</body>\r\n</html>\r\n'
MyStrTxt = html2text.html2text(MyStr.decode("utf8"))
clean_string = re.sub(r'(&q;=\s*uot;)|=\s*;\s*', lambda x: '"' if x.group(1) else '', MyStrTxt)
js = json.loads(clean_string)
print(js['vpn_detail']['username'])
# => 'kushpate'