【问题标题】:How to get partial information from JSON data in Python?如何从 Python 中的 JSON 数据中获取部分信息?
【发布时间】:2021-06-02 22:19:43
【问题描述】:

我有一个 JSON 数据列表,希望从“data-target-user-id”中提取所有 id。如何使用 regex 或 beautifulsoup 做到这一点?

my_lst_JSON = [‘<div id="a-exse-tile" class="j-exse profile-tile" data-exp-enabled="true" user-id="115389" user-type="8" data-viewing-self="false" <!--section --></div></div></div>’,
               ‘<div id="a-exse-tile" class="j-exse profile-tile" data-exp-enabled="true" user-id="1109" user-type="9" data-viewing-self="false" <!--section --></div></div></div>’,
               ‘<div id="a-exse-tile" class="j-exse profile-tile" data-exp-enabled="true" user-id="2890" user-type="7" data-viewing-self="false" <!--section --></div></div></div>’,
               ‘<div id="a-exse-tile" class="j-exse profile-tile" data-exp-enabled="true" user-id="22567" user-type="8" data-viewing-self="false" <!--section --></div></div></div>’,
               ‘<div id="a-exse-tile" class="j-exse profile-tile" data-exp-enabled="true" user-id="33872" user-type="1" data-viewing-self="false" <!--section --></div></div></div>’]

预期输出:

['115389', '1109', '2890', '22567', '33872']

我尝试了@zx485 建议的方法,代码如下:

ids_lst = []

for data in my_lst_JSON:
    soup = BeautifulSoup(data, 'xml')
    ids_lst.append([item.text for item in soup.findAll('div/@user-id')])

它返回一个空白列表...

感谢任何想法!

谢谢。

【问题讨论】:

  • 这是用 JSON 封装的 XML。解包 XML 并使用 XPath div/@user-id 提取相关部分。
  • 否...这只是字符串的一部分,它是一个示例列表。 @MendelG

标签: json python-3.x regex xml beautifulsoup


【解决方案1】:

这应该可行

from bs4 import BeautifulSoup as bs
        
my_lst_JSON = ['<div id="a-exse-tile" class="j-exse profile-tile" data-exp-enabled="true" user-id="115389" user-type="8" data-viewing-self="false" <!--section --></div></div></div>',
         '<div id="a-exse-tile" class="j-exse profile-tile" data-exp-enabled="true" user-id="1109" user-type="9" data-viewing-self="false" <!--section --></div></div></div>',
         '<div id="a-exse-tile" class="j-exse profile-tile" data-exp-enabled="true" user-id="2890" user-type="7" data-viewing-self="false" <!--section --></div></div></div>',
         '<div id="a-exse-tile" class="j-exse profile-tile" data-exp-enabled="true" user-id="22567" user-type="8" data-viewing-self="false" <!--section --></div></div></div>',
         '<div id="a-exse-tile" class="j-exse profile-tile" data-exp-enabled="true" user-id="33872" user-type="1" data-viewing-self="false" <!--section --></div></div></div>']
        
user_ids = [bs(item).find("div")["user-id"] for item in my_lst_JSON]
print(user_ids)

但我更喜欢@Boomshakalaka 解决方案,它更优雅

import re
my_lst_JSON = ['<div id="a-exse-tile" class="j-exse profile-tile" data-exp-enabled="true" user-id="115389" user-type="8" data-viewing-self="false" <!--section --></div></div></div>',
 '<div id="a-exse-tile" class="j-exse profile-tile" data-exp-enabled="true" user-id="1109" user-type="9" data-viewing-self="false" <!--section --></div></div></div>',
 '<div id="a-exse-tile" class="j-exse profile-tile" data-exp-enabled="true" user-id="2890" user-type="7" data-viewing-self="false" <!--section --></div></div></div>',
 '<div id="a-exse-tile" class="j-exse profile-tile" data-exp-enabled="true" user-id="22567" user-type="8" data-viewing-self="false" <!--section --></div></div></div>',
 '<div id="a-exse-tile" class="j-exse profile-tile" data-exp-enabled="true" user-id="33872" user-type="1" data-viewing-self="false" <!--section --></div></div></div>']

user_ids = [re.findall('\d+|$', item)[0] for item in my_lst_JSON]
print(user_ids)

【讨论】:

  • 感谢您的回答!
【解决方案2】:

re.findall('\d+|$', my_lst_JSON[0])[0] 正在工作!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-20
    • 2019-09-06
    相关资源
    最近更新 更多