获取维基百科文章的第一行

时间:2009-10-14 10:03:39

标签: parsing wikipedia wikipedia-api

我收到了维基百科文章,我想从文章中获取第一行z(或第一个x字符,或前y个字,无关紧要)。

问题:我可以获得源Wiki-Text(通过API)或解析的HTML(通过直接HTTP-Request,最终在打印版本上)但是如何找到显示的第一行? Normaly源(html和wikitext)以信息框和图像开头,第一个要显示的真实文本在代码中的某处。

例如: Albert Einstein on Wikipedia(印刷版)。看看代码,第一个真正的文本行“Albert Einstein(发音为/ælbərtaɪnstaɪn/;德语:[albɐtaɪ̯nʃtaɪ̯n]; 1879年3月14日至1955年4月18日)是一位理论物理学家。”不是一开始。这同样适用于Wiki-Source,它以相同的信息框开头,依此类推。

那么你将如何完成这项任务?编程语言是java,但这不重要。

我想到的一个解决方案是使用xpath查询,但是这个查询处理所有边界情况会相当复杂。 [更新]这并不复杂,请参阅下面的解决方案![/ update]

谢谢!

9 个答案:

答案 0 :(得分:10)

你不需要。

API的exintro参数仅返回文章的第一个(第0个)部分。

示例: api.php?action=query&prop=extracts&exintro&explaintext&titles=Albert%20Einstein

还有其他参数:

  • exchars     字符提取长度。
  • exsentences     要返回的句子数。
  • exintro     仅返回第0部分。
  • exsectionformat     用于明文提取的标题格式:

    wiki — e.g., == Wikitext ==
    plain — no special decoration
    raw — this extension's internal representation
    
  • exlimit     要返回的最大提取数。由于摘录生成可能很慢,因此仅限介绍摘录的限制为20,对于整页摘录限制为1。
  • explaintext     返回纯文本摘录。
  • excontinue     当有更多结果可用时,请使用此参数继续。

来源:https://www.mediawiki.org/wiki/Extension:MobileFrontend#prop.3Dextracts

答案 1 :(得分:3)

我也有同样的需求并编写了一些Python代码来实现这一目标。

脚本下载带有给定名称的维基百科文章,使用BeautifulSoup解析它并返回前几段。

代码位于http://github.com/anandology/sandbox/blob/master/wikisnip/wikisnip.py

答案 2 :(得分:2)

维基百科提供摘要download。虽然这是一个非常大的文件(目前是2.5GB),但它可以为所有文章提供您想要的信息。

答案 3 :(得分:1)

您需要一个可以读取维基百科标记的解析器。尝试WikiTextXWiki附带的解析器。

这将允许您忽略任何您不想要的东西(标题,表格)。

答案 4 :(得分:1)

我在Firefox中打开了Albert Einstein的文章,然后点击了View source。使用HTML解析器很容易解析。您应该关注<p>并从中删除其他html。

答案 5 :(得分:1)

例如,如果您将结果包含在字符串中 你会找到文字:

<div id="bodyContent">

在那个索引之后你会找到第一个

<p>

这将是您提到的第一段的索引。

试试这个网址 Link to the content (just works in the browser)

答案 6 :(得分:0)

好吧,当使用Wiki源本身时,您可以在开始时删除所有模板。对于大多数具有信息框或顶部消息的文章,这可能会运行得很好。

但是,有些文章可能会将起始模糊放入模板本身,因此在那里会有点困难。

另一种可能更可靠的方法是获取直接出现在文章文本中的第一个<p>标记的内容(因此不会嵌套在表格中)。这应该在开始时删除信息框和其他内容,因为这些可能(我不完全确定)<table> s或<div> s。

一般来说,维基百科是为人类消费而编写的,对语义的支持非常少。这使得从文章中自动提取特定信息非常痛苦。

答案 7 :(得分:0)

正如您所料,您可能不得不最终解析源代码,已编译的HTML或两者。但是,Wikipedia:Lead_section可能会给你一些关于在写得好的文章中会有什么期望的迹象。

答案 8 :(得分:0)

我制定了以下解决方案: 在XHTML-Source-Code 上使用xpath-query(我使用了print-version,因为它更短,但它也适用于普通版本。)

//html/body//div[@id='bodyContent']/p[1]

这适用于德语和英语维基百科,我没有找到一篇文章,它没有输出第一段。 解决方案也很快,我还想过只采用xhtml的第一个x字符,但这会使xhtml无效。

如果有人在这里搜索JAVA代码,那么就是:

private static DocumentBuilderFactory dbf;
static {
    dbf = DocumentBuilderFactory.newInstance();
    dbf.setAttribute("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
}
private static XPathFactory xpathf = XPathFactory.newInstance();
private static String xexpr = "//html/body//div[@id='bodyContent']/p[1]";


private static String getPlainSummary(String url) {
    try {
        // OPen Wikipage
        URL u = new URL(url);
        URLConnection uc = u.openConnection();
        uc.setRequestProperty("User-Agent", "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1) Gecko/20090616 Firefox/3.5");
        InputStream uio = uc.getInputStream();
        InputSource src = new InputSource(uio);

        //Construct Builder
        DocumentBuilder builder = dbf.newDocumentBuilder();
        Document docXML = builder.parse(src);

        //Apply XPath
        XPath xpath = xpathf.newXPath();
        XPathExpression xpathe = xpath.compile(xexpr);
        String s = xpathe.evaluate(docXML);

        //Return Attribute
        if (s.length() == 0) {
            return null;
        } else {
            return s;
        }
    }
    catch (IOException ioe) {
        logger.error("Cant get XML", ioe);
        return null;
    }
    catch (ParserConfigurationException pce) {
        logger.error("Cant get DocumentBuilder", pce);
        return null;
    }
    catch (SAXException se) {
        logger.error("Cant parse XML", se);
        return null;
    }
    catch (XPathExpressionException xpee) {
        logger.error("Cant parse XPATH", xpee);
        return null;
    }
}

通过调用getPlainSummary("http://de.wikipedia.org/wiki/Uma_Thurman");

来使用它