【问题标题】:Convert BeautifulSoup Tag to json将 BeautifulSoup 标签转换为 json
【发布时间】:2023-03-03 16:16:01
【问题描述】:

网页html的一部分是这样的:

<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的正确方法是什么?谢谢。

【问题讨论】:

    标签: python json parsing beautifulsoup


    【解决方案1】:

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

    如果我将您的示例设置为 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) 也是如此。似乎有一个无与伦比的括号]

    希望您只是剪切和粘贴不正确,但如果您不正确,则可以使用字符串方法提取您要查找的数据。我已经在我的一些擦伤上使用了这种方法,所以我知道它可以工作。

    【讨论】:

      【解决方案2】:

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

      <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}]}]}
      

      【讨论】:

      • 感谢您的帮助!希望你不介意我选择了另一个更详细的答案!
      • 一切都很好@MarkK,很高兴你得到了你需要的帮助!
      猜你喜欢
      • 2020-04-27
      • 2014-03-09
      • 2017-01-15
      • 2019-02-04
      • 2019-06-19
      • 1970-01-01
      • 1970-01-01
      • 2018-05-20
      • 1970-01-01
      相关资源
      最近更新 更多