问题
我有以下 Page01.htm
<!DOCTYPE html><html lang="it-IT"><head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=Edge"> <head><title>Title here</title></head>
<body>
<script id="TargetID" type="application/json"><![CDATA[
{ "name":"Kate", "age":22, "city":"Boston"}
]]>
</script><script id=“AnotherID” type="application/json"><![CDATA[{ "name":"John", "age":31, "city":"New York"}]]>
</script>
</body></html>
我想使用提取脚本标签之间JSON内的信息ID=TargetID
。
我做了什么
我编写了以下Python 3.6代码:
from bs4 import BeautifulSoup
import codecs
page_path="/Users/me/Page01.htm"
page = codecs.open(page_path, "r", "utf-8")
soup = BeautifulSoup(page.read(), "lxml")
vegas = soup.find_all(id="TargetID")
invalid_tags = ['script']
soup = BeautifulSoup(str(vegas),"lxml")
for tag in invalid_tags:
for match in soup.findAll(tag):
match.replaceWithChildren()
JsonZ = str(soup)
现在,如果我查看vegas
变量内部,我可以看到
[<script id="TargetID" type="application/json"><![CDATA[ {
> "name":"Kate", "age":22, "city":"Boston"} ]]> </script>]
但是,如果我尝试删除脚本标签(使用此答案脚本),则会得到以下JsonZ
变量
'<html><body><p>[<![CDATA[\n{ "name":"Kate", "age":22, "city":"Boston"}\n]]>\n]</p></body></html>'
没有脚本标签,但另外3个标签(<html><body><p>
)完全没用。我的目标是获取以下字符串{ "name":"Kate", "age":22, "city":"Boston"}
以与Python JSON模块一起加载。
BeautifulSoup几乎会接受所有提供的内容,并尝试将其转换为完整的HTML页面。这就是为什么您收到'<html><body> ...'
。通常这是一件好事,因为HTML的格式可能很差,但是BeautifulSoup仍会处理它。
在您的情况下,提取该json的一种方法是这样的。
>>> import bs4
>>> page = bs4.BeautifulSoup(open('Page01.htm').read(), 'lxml')
>>> first_script = page.select('#TargetID')[0].text
>>> first_script
'<![CDATA[\n{ "name":"Kate", "age":22, "city":"Boston"}\n]]>\n'
>>> content = first_script[first_script.find('{'): 1+first_script.rfind('}')]
>>> content
'{ "name":"Kate", "age":22, "city":"Boston"}'
一旦有了它,就可以将它变成Python字典,就像这样。
>>> import json
>>> d = json.loads(content)
>>> d['name']
'Kate'
>>> d['age']
22
>>> d['city']
'Boston'
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句