【问题标题】:How to Extract/Scrape a specific part of information from WikiData URLs如何从 WikiData URL 中提取/抓取信息的特定部分
【发布时间】:2022-01-21 06:01:11
【问题描述】:

我有一个我想从 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 之外,还有什么更好的方法可以从 URL 中抓取/提取该信息?

非常感谢!

【问题讨论】:

  • 您能更详细地解释一下first set of "P31" 的含义吗?我试图了解这如何应用于第二个 url,从而导致您在上面显示的输出。回复中是否可以有多个 P31?或者多个值与 P31 键关联?
  • @QHarr 如果你点击上面的网址会看到一堆信息,如果你使用find and input P31,它会报告一堆P31,但我只需要第一个P31 是所有结果中的结果。
  • @QHarr 我刚刚用截图更新了问题。

标签: python web-scraping beautifulsoup request


【解决方案1】:

您只需要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)

【讨论】:

  • 非常感谢!我对 Python 很陌生,所以我想知道 s.headers 的行是什么?
  • 它只是通过在标题中提供用户代理标识符来模拟使用浏览器(在这种情况下)见docs.python-requests.org/en/latest/user/quickstart/…
  • 知道了。所以我基本上可以把它改成任何用户代理。
  • 是的,但不确定在这种情况下是否需要。我出于习惯添加了它。一些服务器可能配置有接受/拒绝的用户代理列表。
猜你喜欢
  • 2018-08-25
  • 2016-05-23
  • 1970-01-01
  • 2021-04-20
  • 2018-09-20
  • 1970-01-01
  • 2019-08-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多