如何 Extract/Scrape 来自维基数据 URL 的特定信息部分

How to Extract/Scrape a specific part of information from WikiData URLs

我有一个要从 WikiData 网站上抓取的 webid 列表。这里以两个链接为例。

https://www.wikidata.org/wiki/Special:EntityData/Q317521.jsonld https://www.wikidata.org/wiki/Special:EntityData/Q478214.jsonld

我只需要URL的第一套“P31”。对于第一个 URL,我需要的信息将是 "wd:Q5",第二个 URL 将是 ["wd:Q786820", "wd:Q167037", "wd:Q6881511","wd:Q4830453","wd:Q431289","wd:Q43229","wd:Q891723"],并将它们存储到列表中。

当我使用查找并输入“P31”时,我只需要所有结果中的第一个结果。上图说明了

输出将如下所示。

info = ['wd:Q5',
        ["wd:Q786820", "wd:Q167037", "wd:Q6881511","wd:Q4830453","wd:Q431289","wd:Q43229","wd:Q891723"],
        ]
lst = ["Q317521","Q478214"]

for q in range(len(lst)):
  link =f'https://www.wikidata.org/wiki/Special:EntityData/{q}.jsonld'
  page = requests.get(link)
  soup = BeautifulSoup(page.text, 'html.parser')

之后,我不知道如何从第一组“P31”中提取信息。我正在使用 request, BeautifulSoup, and Selenium 库,但我想知道除了使用 XPath 或 Class 之外,还有什么更好的方法来 scrape/extract 来自 URL 的信息?

非常感谢!

您只需要 requests,因为您会收到 JSON 回复。

您可以使用一个函数来循环相关的 JSON 嵌套对象并在第一次出现目标键时退出,同时将相关值附加到列表中。

循环变量应该是要添加到请求的 url 中的 ID。

import requests

lst = ["Q317521","Q478214"]
info = []

def get_first_p31(data):
    for i in data['@graph']:
        if 'P31' in i:
            info.append(i['P31'])
            break
    
with requests.Session() as s:
    s.headers = {"User-Agent": "Safari/537.36"}
    for q in lst:
        link =f'https://www.wikidata.org/wiki/Special:EntityData/{q}.jsonld'
        try:
            r = s.get(link).json()
            get_first_p31(r)
        except:
            print('failed with link: ', link)