Python从静态HTML文件中获取值

Python从静态HTML文件中获取值,python,json,Python,Json,我有一个HTML文件,可以用Python进行卷曲和下载。然而,我不知道如何从中获取我想要的数据。我曾使用BS从XML文件中获取价值,但从未使用过类似的方法。以下是我试图读取和获取的文件部分: <script> var AC = {}; AC.org_json = { "id": "manager", "children": [ { "id": "employee1", "children": [],

我有一个HTML文件,可以用Python进行卷曲和下载。然而,我不知道如何从中获取我想要的数据。我曾使用BS从XML文件中获取价值,但从未使用过类似的方法。以下是我试图读取和获取的文件部分:

<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字典中。

下面是我要做的:

  • 用于解析HTML文件
  • 运行
    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