将BeautifulSoup标记转换为json

2024-10-01 15:39:19 发布

您现在位置:Python中文网/ 问答频道 /正文

网页html的一部分<;类“bs4.element.Tag”>;就像:

<script>

                    var id46 = {"columns":    [{"id":"column0","label":"date","type":"string","role":"domain","pattern":""},{"id":"column1","label":"","type":"number","role":"data","pattern":"#0.###############"}],"rows":[{"c":[{"v":"August-12","f":null},{"v":7,"f":null}]},{"c":[{"v":"September-12","f":null},{"v":10,"f":null}]}]}],"p":{}}

;

                  </script>

我想提取它的内容并将其转换为json。我两种都试过了,但都不起作用:

jsonData = json.loads(sss.attrs["var id46"])
jsonData = json.loads(sss.text)

将其转换为json的正确方法是什么?多谢各位


Tags: idjson网页varhtmltypescriptnull
2条回答

试试这个,虽然不清楚是否需要这样做

如果我将您的示例设置为data并以这种方式使用,您将看到.attrs将是一个空字典{}

soup = BeautifulSoup(data, "html.parser")
soup.attrs
soup.find('script').attrs

但是,如果我把文本作为字符串取出,你可以自己得到字典

s = soup.find(string=re.compile('columns'))
s_dict = s.split('var id46 = ')[1].strip().replace(';', '')

现在,当我试图使用json.loads(s_dict)时,它给了我一个错误,eval(s_dict)。似乎有一个不匹配的括号]

希望您只是不正确地剪切和粘贴,但是如果您没有这样做,那么您可以使用字符串方法来提取您正在查找的数据。我在我的一些擦伤上使用过这种方法,所以我知道它可以工作

您可以尝试使用with正则表达式,尽管我怀疑var id46不是正确的字典对象

<script type="text/javascript">
    var id46 = {"columns": [{"id":"column0","label":"date","type":"string","role":"domain","pattern":""},{"id":"column1","label":"","type":"number","role":"data","pattern":"#0.###############"}],"rows":[{"c":[{"v":"August-12","f":null},{"v":7,"f":null}]},{"c":[{"v":"September-12","f":null},{"v":10,"f":null}]}]}
</script>

找到脚本并应用re提取字典对象

script = soup.find('script')

pattern = re.compile('({.+})')
result = pattern.findall(str(script))

jsonData = json.loads(result[0])

print(jsonData)

你的jsonData应该是这样的。希望这能有所帮助


{'columns': [{'id': 'column0',
              'label': 'date',
              'pattern': '',
              'role': 'domain',
              'type': 'string'},
             {'id': 'column1',
              'label': '',
              'pattern': '#0.###############',
              'role': 'data',
              'type': 'number'}],
 'rows': [{'c': [{'f': None, 'v': 'August-12'}, {'f': None, 'v': 7}]},
          {'c': [{'f': None, 'v': 'September-12'}, {'f': None, 'v': 10}]}]}

相关问题 更多 >

    热门问题