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

Parsing 获取维基百科文章的第一行,parsing,wikipedia,wikipedia-api,Parsing,Wikipedia,Wikipedia Api,我收到一篇维基百科文章,我想从文章中提取第一个z行(或者第一个x字符,或者第一个y单词,都不重要)。 问题是:我可以获取源Wiki文本(通过API)或解析的HTML(通过直接HTTP请求,最终在打印版本上),但如何找到显示的第一行?通常,源代码(html和wikitext)以信息框和图像开始,第一个显示的真实文本位于代码的下面 例如: (印刷版)。看看代码,第一行真正的文字“阿尔伯特·爱因斯坦(1879年3月14日至1955年4月18日)是一位理论物理学家。”并不是一开始。这同样适用于,它以相同

我收到一篇维基百科文章,我想从文章中提取第一个z行(或者第一个x字符,或者第一个y单词,都不重要)。

问题是:我可以获取源Wiki文本(通过API)或解析的HTML(通过直接HTTP请求,最终在打印版本上),但如何找到显示的第一行?通常,源代码(html和wikitext)以信息框和图像开始,第一个显示的真实文本位于代码的下面

例如: (印刷版)。看看代码,第一行真正的文字“阿尔伯特·爱因斯坦(1879年3月14日至1955年4月18日)是一位理论物理学家。”并不是一开始。这同样适用于,它以相同的信息框开始,以此类推

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

我想到的一个解决方案是使用xpath查询,但该查询对于处理所有边界情况来说相当复杂。[更新]没有那么复杂,请参见下面我的解决方案![/更新]


谢谢

好吧,当使用Wiki源代码时,您可以从一开始就删除所有模板。对于大多数顶部有信息框或一些消息的文章来说,这可能已经足够好了

然而,有些文章可能会将开始的导语放在模板中,这样做会有点困难

另一种可能更可靠的方法是获取直接出现在文章文本中的第一个
标记的内容(因此不嵌套在表中)。这应该在一开始就去掉信息框和其他东西,因为它们可能(我不太确定)是
s或
s


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

您需要一个能够读取维基百科标记的解析器。尝试或使用随附的解析器


这将允许您忽略任何您不想要的内容(标题、表格)。

正如您所期望的,您可能需要解析源代码、编译的HTML或两者。但是,在写得好的文章中可能会给您一些提示。

我也有同样的需要,并为此编写了一些Python代码

该脚本下载具有给定名称的wikipedia文章,使用BeautifulSoup对其进行解析,并返回前几段


代码位于

我在Firefox上打开了Albert Einstein的文章,点击了View source。使用HTML解析器进行解析非常容易。你应该把注意力集中在
上,去掉其中的其他html。

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

例如,如果结果是字符串 您可以找到以下文本:

<div id="bodyContent">

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

<p>

这就是你提到的第一段的索引

试试这个网址
我想出了以下解决方案: 在XHTML源代码上使用xpath查询(我选择打印版本,因为它较短,但也适用于普通版本)

这在德语和英语维基百科上都有效,我还没有发现一篇文章不输出第一段。解决方案也相当快,我还想过只获取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");

您不需要这样做

API的
exintro
参数只返回文章的第一节(第零节)

示例:

还有其他参数:

  • exchars
    以字符为单位的摘录长度
  • ex句子
    要返回的句子数
  • exintro
    只返回第0节
  • exsectionformat
    用于纯文本摘录的节标题格式:

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

来源:

“我们认为系统不会填充信息数据库,而只会从公共百科全书数据库(如Wikipedia)检索内容”-凯曼:该数据库只检索文章的Wiki来源。OP提出的问题仍然适用。这是一个非常实用的解决方案,但请注意,此解决方案取决于wiki标记如何转换为HTML。如果可以,我建议直接解析wiki标记。我试过了。但结果非常困难,因为标记包含
{{…}}
形式的函数调用。例如,
{{convert | 1.2 | km | mi | spell=us}
。以下是我的尝试:感谢您的回答,这将引导我进入上面的解决方案(选择bodyContent-div的第一段)。
wiki — e.g., == Wikitext ==
plain — no special decoration
raw — this extension's internal representation