获得维基百科文章的第一线(Get first lines of Wikipedia Article)

2019-07-28 01:58发布

我有一个维基百科文章,我想从文章获取第一Z线(或第一个x字符,或者第一Y的话,没关系)。

问题:我可以在源维基文本(通过API)或解析HTML(通过直接HTTP请求,最终在打印版),但我怎么能找到所显示的第一线? Normaly源(HTML和wikitext的)与信息盒和图像,并第一次真正的文本开始显示是某处的代码。

例如: 爱因斯坦在维基百科 (打印版)。 期待中的代码,第一个真正的文本行“阿尔伯特·爱因斯坦(读/ælbərtaɪnstaɪn/;德语:albɐtaɪ̯nʃtaɪ̯n]; 3月14日1879年至1818年1955年4月)。是一个理论物理学家” 是不是开始。 这同样适用于维基源 ,其与同一个信息箱等开始。

所以,你会如何完成这个任务? 编程语言是Java,但是这不应该的问题。

它来到我的脑海中的溶液中使用XPath查询,但此查询将是比较复杂的,以处理所有的边界情况。 [更新]这是没有那么复杂,见下面我的解决方案![/更新]

谢谢!

Answer 1:

你并不需要。

API的exintro参数仅返回第一个(零)的一节。

例如: ?api.php行动=查询+道具=提取物及exintro&explaintext&标题=阿尔伯特%20Einstein

还有其他的参数,也:

  • exchars字符提取物的长度。
  • exsentences句子数返回。
  • exintro只返回零一节。
  • exsectionformat使用什么节标题格式明文提取物:

     wiki — eg, == 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



Answer 2:

我也是在同样的需求,并写了一些Python代码做到这一点。

脚本下载与定名称的维基百科文章,用BeautifulSoup解析它,并返回前几个段落。

代码是http://github.com/anandology/sandbox/blob/master/wikisnip/wikisnip.py 。



Answer 3:

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



Answer 4:

你需要一个解析器,可以阅读维基百科的标记。 尝试wiki文字或附带的解析器XWiki实现 。

这将让你忽略你不想(标题,表格)任何东西。



Answer 5:

我打开了爱因斯坦的文章在Firefox和我点击查看源代码。 这是很容易使用HTML解析器来解析。 你应该集中在<p>和从内它剥去其他HTML。



Answer 6:

例如,如果您有结果在一个字符串,你会发现文字:

<div id="bodyContent">

和索引后,你会发现第一

<p>

这将是你提到的第一个段落的索引。

试试这个网址链接到内容(只需在浏览器的工作原理)



Answer 7:

那么,使用维基源本身时,你可以只去掉所有模板的开始。 这可能工作不够好,有鉴于InfoBoxes或在顶部的一些消息大多数文章。

然而,一些文章可能把首发的Blurb到模板本身,这样会有点困难的那里。

另一种方式,也许更可靠,将采取的第一个中的内容<p>直接出现在文章文本标签(因此不是嵌套在表左右)。 这应该在开始去掉InfoBoxes到和其他的东西,这些可能是(我不太确定) <table> S或<div>秒。

一般来说,维基百科是供人食用,只有对任何语义很小支持写入。 这使得从文章相当痛苦的具体信息自动提取。



Answer 8:

当你想到,你可能会落得解析源,编译后的HTML,或两者兼而有之。 但是, 维基百科:Lead_section可能会给你什么样的期待在精心撰写的文章一些指示。



Answer 9:

我制定了以下解决方案: 使用的XHTML的源代码一个的XPath查询 (我拿着打印的版本,因为它是短,但它也适用于普通版)。

//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");



文章来源: Get first lines of Wikipedia Article