0

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

4

1 回答 1

3

我怀疑你会得到你正在寻找的东西只是复制粘贴。JSoup 是 HTML 解析器,您必须查找元素并编写相应的选择器以获取其内容。

如果您使用的是 Chrome,请右键单击元素(文本)并选择检查元素,一旦打开 HTML 源,请右键单击相应的元素并选择Copy CSS Path

对于 Country ( 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

但请注意,如果 Wikipedia 决定更新其 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

这会输出您在 wiki 上可以看到的所有内容,并且可能不是您想要的,因为在某些情况下缺少标题(标记为_:)。但我想你知道它是如何工作的,你可以用它来过滤掉你正在寻找的东西。

我建议您使用类来保存这些数据并稍后在您的应用程序中显示它。通过这种方式,您可以轻松应用逻辑来检查您是否获得了所有正确的数据,如果失败,您可以创建一个后备来修复它。

于 2014-06-22T22:39:35.370 回答