我收到了维基百科文章,我想从文章中获取第一行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]
谢谢!
答案 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)
答案 4 :(得分:1)
我在Firefox中打开了Albert Einstein的文章,然后点击了View source。使用HTML解析器很容易解析。您应该关注<p>
并从中删除其他html。
答案 5 :(得分:1)
例如,如果您将结果包含在字符串中 你会找到文字:
<div id="bodyContent">
在那个索引之后你会找到第一个
<p>
这将是您提到的第一段的索引。
答案 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");