我需要做的是连接到维基百科,并在列表上方的区域中提取内容,如果可能的话还提取信息(见下图)。 有一些选择:JWPL,Bliki,JSoup。
我尝试了Bliki,但无法从(见图片)获取信息而无法改为瑞典语。 JSoup看起来相当简单,但由于它不是专门为维基百科构建的,因此没有任何简单的方法可以在我之后的页面中获取内容。
使用JSoup我可以非常轻松地获取HTML文档,但无法找到如何仅将我想要的部分作为纯文本。
Document doc = Jsoup.connect("http://sv.wikipedia.org/wiki/Stockholm").get();
Element contentDiv = doc.select("div[id=content]").first();
System.out.println(contentDiv.toString());
使用此Bliki代码返回以纯文本格式化的文档,这很棒,但它不包含下图中的信息。最重要的不是瑞典语,因为我不知道如何改变它。
String[] listOfTitleStrings = { "Stockholm" };
User user = new User("", "", "http://en.wikipedia.org/w/api.php");
user.login();
List<Page> listOfPages = user.queryContent(listOfTitleStrings);
PlainTextConverter p = new PlainTextConverter();
for (Page page : listOfPages) {
WikiModel wikiModel = new WikiModel("${image}","${title}");
String text = wikiModel.render(p, page.toString());
System.out.println(text);
}
将在Android上运行。
编辑:也许我不够清楚,这必须适用于所有维基百科页面。
答案 0 :(得分:3)
我怀疑你是否会得到你正在寻找的只是复制粘贴的东西。 JSoup是HTML解析器,您必须查找元素并根据选择器进行编写以获取其内容。
如果您正在使用Chrome,请右键单击元素(文本)并选择检查元素,然后在HTML源打开后,右键单击相应元素并选择Copy CSS Path
。
对于国家/地区( Land ),您将获得以下内容:
#mw-content-text > table.infobox.geography > tbody > tr:nth-child(5) > td > span > a
当然这可以缩短,但它并没有提高性能,如果你不能很好地了解CSS,那将会很痛苦。
幸运的是,JSoup支持CSS选择器,因此在获得相应元素后你可以做的是:
String countrySelector = "#mw-content-text > table.infobox.geography > tbody > tr:nth-child(5) > td > span > a";
Document doc = Jsoup.connect("http://sv.wikipedia.org/wiki/Stockholm").get();
Element countryEl = doc.select(countrySelector).first();
System.out.println(countryEl.toString());
(我假设您提供的代码正常运行)
如果您希望更快地测试选择器是否正确,您可以直接在Chrome中执行此操作,复制选择器后,将标签更改为Console
,然后使用$("selector")
,然后按Enter键,例如:
$("#mw-content-text > table.infobox.geography > tbody > tr:nth-child(5) > td > span > a")
如果您需要元素的文字内容,可以使用$("selector").text()
。
(您可能已经注意到这是一些简单的jQuery)
但要注意,如果维基百科决定更新他们的DOM布局,这可能容易破解。
对于选择器在多个页面上工作,您可能希望使它们更通用。
要选择的第一件事是infobox
,最好使用table.infobox
,但这仍然可以选择多个元素。您之后的信息通常位于第一个信息框中,因此使用.first()
可以轻松选择。如果这不起作用且您找不到您之后的元素,则可以创建后备以尝试在所有信息框元素中查找信息。
我仍然不确定你到底发生了什么,所以这里是你把上面的代码放在一起的代码:
// Set infobox selector (content on the right side of Wiki page)
String tableSelector = "table.infobox";
// Load document
Document doc = Jsoup.connect("http://en.wikipedia.org/wiki/Gothenburg").get();
// Select infobox element
Element infoboxEl = doc.select(tableSelector).first();
// Select all table rows inside infobox
Elements tableRows = infoboxEl.select("tr");
for (Element row: tableRows) {
// Output the title of each row
System.out.print(row.select("th").text() + ": ");
// Output conent for that title
System.out.println(row.select("td").text());
}
以下是示例输出:
Gothenburg, Sweden Göteborg:
_: From left to right: View over Gothenburg and the Göta älv, Götaplatsen, Svenska Mässan, Gothenburg heritage tram, Elfsborg Fortress, Ullevi.
_: Nickname(s): Little London Little Amsterdam,
_: Gothenburg, Sweden
_: Coordinates: 57°42′N 11°58′E / 57.700°N 11.967°E / 57.700; 11.967Coordinates: 57°42′N 11°58′E / 57.700°N 11.967°E / 57.700; 11.967
Country: Sweden
Province: Västergötland and Bohuslän
County: Västra Götaland County
Municipality: Gothenburg Municipality, Härryda Municipality, Partille Municipality and Mölndal Municipality
Charter: 1621
Area[1]:
• City: 447.76 km2 (172.88 sq mi)
• Water: 14.5 km2 (5.6 sq mi) 3.2%
• Urban: 203.67 km2 (78.64 sq mi)
• Metro: 3,694.86 km2 (1,426.59 sq mi)
Elevation: 12 m (39 ft)
Population (2013 (urban: 2010))[1][2]:
• City: 533,260
• Density: 1,200/km2 (3,100/sq mi)
• Urban: 549,839
• Urban density: 2,700/km2 (7,000/sq mi)
• Metro: 956,118
• Metro density: 260/km2 (670/sq mi)
Demonym: Gothenburger (Göteborgare)
Time zone: CET (UTC+1)
• Summer (DST): CEST (UTC+2)
Postal code: 40xxx - 41xxx - 421xx - 427xx
Area code(s): (+46) 31
Website: www.goteborg.se
这会输出您在维基上可以看到的所有内容,但可能并不完全是您想要的内容,因为在某些情况下会丢失标题(标记为_:
)。但我认为您了解这是如何工作的,您可以使用它来过滤掉您正在寻找的内容。
我建议您使用class来保存这些数据,并在以后将其显示在您的应用程序中。通过这种方式,您可以轻松应用逻辑来检查您是否获得了所有正确的数据,如果失败,您可以创建一个后备来修复它。