连接到瑞典维基百科以提取信息

时间:2014-06-22 22:22:32

标签: java android jsoup bliki

我需要做的是连接到维基百科,并在列表上方的区域中提取内容,如果可能的话还提取信息(见下图)。 有一些选择: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上运行。 编辑:也许我不够清楚,这必须适用于所有维基百科页面。 Information I want

1 个答案:

答案 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来保存这些数据,并在以后将其显示在您的应用程序中。通过这种方式,您可以轻松应用逻辑来检查您是否获得了所有正确的数据,如果失败,您可以创建一个后备来修复它。