-3

我使用网络抓取提取了一个关于 64 位 Steam ID 和好友列表的字符串。我想获得唯一的 steamid,以便我可以将它们存储在不同的文件中。我使用了正则表达式,但我认为我在符号部分有错误。

这是字符串。

{"friendslist":{"friends":[{"steamid":"7656xxxxxxx80x76","relationship":"friend","friend_since":1552765824},{"steamid":"76561xxxxxxx4xx89","relationship":"friend","friend_since":1508594830},{"steamid":"765xxxxxxxxxxx3194","relationship":"friend","friend_since":1543773569}]}}

我这样使用正则表达式:

import re
re.findall("[^:[0-9]+[0-9]+", soup.text)

但是,我得到了这个结果:

['"7656xxxxxxx80x76',
'"76561xxxxxxx4xx89',
'"765xxxxxxxxxxx3194']

我将如何摆脱数字开头的同上标记(“)?

4

4 回答 4

1

你有 JSON 字符串,所以使用模块json

import json

text = '{"friendslist":{"friends":[{"steamid":"7656xxxxxxx80x76","relationship":"friend","friend_since":1552765824},{"steamid":"76561xxxxxxx4xx89","relationship":"friend","friend_since":1508594830},{"steamid":"765xxxxxxxxxxx3194","relationship":"friend","friend_since":1543773569}]}}'

data = json.loads(text)

for friend in data["friendslist"]['friends']:
    print(friend['steamid'])

结果:

7656xxxxxxx80x76
76561xxxxxxx4xx89
765xxxxxxxxxxx3194
于 2019-09-03T11:48:25.053 回答
0

我做了一个递归函数,它接受数据和键,然后列出结果:

data = {"friendslist":{"friends":[{"steamid":"7656xxxxxxx80x76","relationship":"friend","friend_since":1552765824},{"steamid":"76561xxxxxxx4xx89","relationship":"friend","friend_since":1508594830},{"steamid":"765xxxxxxxxxxx3194","relationship":"friend","friend_since":1543773569}]}}
def getDataFromNestedDict(data, dictKey):
    if isinstance(data, dict):
        if dictKey in data.keys():
            steamDataList.append(data[dictKey])
        for key, value in data.items():
            if isinstance(value, dict):
                getDataFromNestedDict(value, dictKey)
            elif isinstance(value, list):
                for item in value:
                    getDataFromNestedDict(item,dictKey)

    elif isinstance(data, list):
        for item in data:
            getDataFromNestedDict(item,dictKey)
steamDataList = []
getDataFromNestedDict(data, 'steamid')
print(steamDataList)

输出:

['7656xxxxxxx80x76', '76561xxxxxxx4xx89', '765xxxxxxxxxxx3194']
于 2019-09-03T11:44:47.977 回答
0

您提供的正则表达式没有达到您的预期。第一个[与第一个匹配]

使用前瞻/后向查找双引号:

(?<=\")(\d+[x\d]+\d)(?=\")

不过,@Furas 是对的。您应该只是解析 JSON。

于 2019-09-03T11:51:55.343 回答
0

我建议您遵循@furas 的答案(使用 json 解析器)。

但是如果你真的想使用正则表达式: [^ ["]+[0-9]+[0-9]+

于 2019-09-03T11:56:49.430 回答