我有一个维基百科文章,我想从文章获取第一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查询,但此查询将是比较复杂的,以处理所有的边界情况。 [更新]这是没有那么复杂,见下面我的解决方案![/更新]
谢谢!
你并不需要。
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
我也是在同样的需求,并写了一些Python代码做到这一点。
脚本下载与定名称的维基百科文章,用BeautifulSoup解析它,并返回前几个段落。
代码是http://github.com/anandology/sandbox/blob/master/wikisnip/wikisnip.py 。
维基百科提供了一个文摘下载 。 虽然这是一个相当大的文件(目前为2.5GB
),它提供了正是您想要的信息,所有的文章。
你需要一个解析器,可以阅读维基百科的标记。 尝试wiki文字或附带的解析器XWiki实现 。
这将让你忽略你不想(标题,表格)任何东西。
我打开了爱因斯坦的文章在Firefox和我点击查看源代码。 这是很容易使用HTML解析器来解析。 你应该集中在<p>
和从内它剥去其他HTML。
那么,使用维基源本身时,你可以只去掉所有模板的开始。 这可能工作不够好,有鉴于InfoBoxes或在顶部的一些消息大多数文章。
然而,一些文章可能把首发的Blurb到模板本身,这样会有点困难的那里。
另一种方式,也许更可靠,将采取的第一个中的内容<p>
直接出现在文章文本标签(因此不是嵌套在表左右)。 这应该在开始去掉InfoBoxes到和其他的东西,这些可能是(我不太确定) <table>
S或<div>
秒。
一般来说,维基百科是供人食用,只有对任何语义很小支持写入。 这使得从文章相当痛苦的具体信息自动提取。
当你想到,你可能会落得解析源,编译后的HTML,或两者兼而有之。 但是, 维基百科:Lead_section可能会给你什么样的期待在精心撰写的文章一些指示。
我制定了以下解决方案: 使用的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");