Python从静态HTML文件中获取值
我有一个HTML文件,可以用Python进行卷曲和下载。然而,我不知道如何从中获取我想要的数据。我曾使用BS从XML文件中获取价值,但从未使用过类似的方法。以下是我试图读取和获取的文件部分:Python从静态HTML文件中获取值,python,json,Python,Json,我有一个HTML文件,可以用Python进行卷曲和下载。然而,我不知道如何从中获取我想要的数据。我曾使用BS从XML文件中获取价值,但从未使用过类似的方法。以下是我试图读取和获取的文件部分: <script> var AC = {}; AC.org_json = { "id": "manager", "children": [ { "id": "employee1", "children": [],
<script>
var AC = {};
AC.org_json =
{
"id": "manager",
"children": [
{
"id": "employee1",
"children": [],
"data": {
"direct_reports": 0,
"badge_color": "F",
"badge_url": "https://someurl",
"full_name": "Employee1 Name",
"job_title": "Employee Job Title",
"department_name": "IT",
"building": "SITE1",
"phone": null,
"expanded": false
}
},
{
"id": "employee2",
"children": [],
"data": {
"direct_reports": 0,
"badge_color": "F",
"badge_url": "https://someurl",
"full_name": "Employee2 Name",
"job_title": "Employee Job Title",
"department_name": "IT",
"building": "SITE1",
"phone": null,
"expanded": false
}
},
......continues for however many entries there are.
</script>
它给出了上面的精确输出。下一个问题是如何从数据中获取值?
如果我这样做:
然后我得到:
ValueError:无法解码任何JSON对象
您正试图从另一种语言(HTML)中解析javascript字典(JSON)因此,理想情况下,您可以使用真正的解析器加载html,然后使用真正的解析器加载javascript,但如果您完全了解自己的文件格式,那么您可以修改一些正则表达式来删除除JSON之外的所有内容,然后使用JSON.loads()将其解析到python字典中。下面是我要做的:
soup.find_all('script')
以获取所有脚本标记json.loads()
,然后从返回的字典中获取值如果你知道只有一个脚本标签,#3相当简单。如果可能有其他脚本块包含大量非JSON javascript,那么您可能需要使用一些正则表达式,或者使用try/catch块becauese
JSON.loads()
如果传递的字符串不是JSON,则可能会出错。所以我猜这就是我要寻找的:下一个问题是如何从html中获取完整的JSON,对吗?正如我所说,您可能想尝试破解一些正则表达式,删除除JSON之外的所有内容。看一看,因为听起来你不太明白我的答案。但我要警告您,正则表达式对于常规语言是规则的,而html和javascript在解析意义上绝对不是规则的,因此您可能会遇到麻烦。看看为什么这不容易。不过,您可能可以使用其中一个html解析库来获取脚本标记。是的,这非常有效。因此,当我在上面执行json.loads()
时,我会得到以下错误:TypeError:expected string或buffer
json.loads将字符串作为参数加载到python字典中并返回dict。请确保您将脚本标记的内容作为字符串传递,而不是标记本身,它是bs4标记对象。例如,执行以下操作:json.loads(script_tag.string)。不要这样做:json.loads(script#u标记);我们只需要提取JSON.loads的JSON部分。要做到这一点,您可以使用regex,就像前面提到的其他评论员一样。另一种简单的方法是在脚本标记';s字符串,然后获取最后一个元素,类似于:script\u dict=json.loads(script\u tag\u string.split('='))[-1])
from bs4 import BeautifulSoup
#opens data file
get_data = open(html,'r').read()
soup = BeautifulSoup(get_data)
title = soup.find("div", id="content")
json_data = title.find_next("script")
print json_data
data = json.loads(json_data)
print data