【问题标题】:How to get table data as rows and columns from wikipedia api?如何从 wikipedia api 获取表格数据作为行和列?
【发布时间】:2020-04-21 18:25:04
【问题描述】:

当我尝试将表数据作为 json 获取时,我可以在以下查询的 json 输出中找到可区分的子项:

https://en.wikipedia.org/w/api.php?action=parse&page=List_of_football_clubs_in_India&prop=wikitext&section=3&format=json

我想得到这个表的行和列(文本):-

https://en.wikipedia.org/wiki/List_of_football_clubs_in_India#Assam

JSON 输出看起来很复杂,我找不到从中提取文本的好方法。

(我在 Javascript (Node.js) 中这样做

请帮忙..

【问题讨论】:

  • 我想要表格(行和列)的文本字段

标签: javascript node.js json mediawiki wikipedia-api


【解决方案1】:

我不确定,你期望什么。您对页面的 API 请求实际上是返回封装成 JSON 结构的 wikitext。但是,wikitext(表是其中的一部分)不是 JSON,所以你不能真正解释它。

我也不太确定,你想要什么信息。如果您想将足球俱乐部放在表格中,那么您唯一的选择就是解析 wikitext(您也可以从 API 返回实际解析的 HTML 以使其“更容易”)并自己浏览数据。但是,这可能是一个容易出错且不好玩的任务。

因此,如果您想以结构化数据格式获取所有印度足球俱乐部,我可能会更好地尝试 Wikidata。它允许您处理结构化数据以获得所需的信息(如果对象具有指向 Wikipedia 页面的链接,还可以获取指向 Wikipedia 文章的链接)。在您的用例中,尝试Wikidata Query service 可能是个好主意。

您可以在此处发出如下查询:

SELECT ?itemLabel ?sitelink WHERE {
  ?item wdt:P31 wd:Q476028;
        wdt:P17 wd:Q668.
  ?sitelink schema:isPartOf <https://en.wikipedia.org/>;
            schema:about ?item.
  SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en". }
}

它查询印度所有足球俱乐部的列表,并返回带有项目标签的列表以及英文维基百科文章的链接: https://query.wikidata.org/#SELECT%20%3FitemLabel%20%3Fsitelink%20WHERE%20%7B%0A%20%20%3Fitem%20wdt%3AP31%20wd%3AQ476028%3B%0A%20%20%20%20%20%20%20%20wdt%3AP17%20wd%3AQ668.%0A%20%20%3Fsitelink%20schema%3AisPartOf%20%3Chttps%3A%2F%2Fen.wikipedia.org%2F%3E%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20schema%3Aabout%20%3Fitem.%0A%20%20SERVICE%20wikibase%3Alabel%20%7B%20bd%3AserviceParam%20wikibase%3Alanguage%20%22%5BAUTO_LANGUAGE%5D%2Cen%22.%20%7D%0A%7D

【讨论】:

    【解决方案2】:

    假设这是 res 是您从 wiki 获得的数据

    //This will get you the innermost part of the object which is the text you want
    let wikiText = res.parse.wikitext['*'];
    
    //This will strip out all the numbers and non-alphabet charater.
    let pureText=wikitext.replace(/[^a-zA-Z\s]+/g, ' ');
    
    

    上面的代码可以让你干净地访问文本;但是,如何分隔列和行取决于您。

    【讨论】:

    • 这有助于删除不必要的字符,但主要问题是text['*'] 是单个对象,不能针对其中的每一行进行迭代。
    • 真的。也许我们可以标记每个单词?
    【解决方案3】:

    这会稍微降低性能(看起来,但我不确定是否存在其他更快的方法)。 这可以通过设置prop=text然后使用JSDOM解析获得的HTML来完成(Node.js自带/用于Node.js)

    【讨论】:

      【解决方案4】:

      我知道这个问题很老,但有一个API 可以解决这个问题。您可以提供页面标题,它会以 JSON 格式返回您选择的表格。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-07-14
        • 2011-03-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多