Jsoup在两个标签之间获取html

时间:2012-07-26 01:09:40

标签: java html wiki jsoup

在像http://wikitravel.org/en/San_Francisco这样的网站上,“区域”,“理解”,“进入”等部分实际上并不包含HTML中的整个部分。部分实际上只是标题中的跨度类。因此,只需选择id就无法获取维基文档的某些部分。

但是,是否可以收集两个标签之间的所有html?说我想要“四处走动”部分。我如何发出一个选择器,说明

之间的所有html
<h2><span class="editsection">[<a href="/wiki/en/index.php?title=San_Francisco&amp;action=edit&amp;section=15" title="Edit section: Get around">edit</a>]</span> <span class="mw-headline" id="Get_around">Get around</span></h2>

<h2><span class="editsection">[<a href="/wiki/en/index.php?title=San_Francisco&amp;action=edit&amp;section=22" title="Edit section: See">edit</a>][<a href="#See" title="click to add a see listing" onclick="addListing(this, '22', 'see', 'San_Francisco');">add listing</a>]</span> <span class="mw-headline" id="See">See</span></h2>

1 个答案:

答案 0 :(得分:3)

哎哟。 HTML不是很容易使用。我认为你可能正在做一些刮痧,所以我知道有时这就是我们处理的很多东西。你标记了这个,所以我会捅它。通常情况下,没有选择器可以使用相当非结构化的HTML。您可以做的是选择第一个h2的所有下一个兄弟姐妹,然后删除第二个h2的所有下一个兄弟姐妹。为了增加痛苦,我们只能通过文本内容识别部分标题,因此我们需要使用:contains选择器。像这样:

Document doc = Jsoup.connect("http://wikitravel.org/en/San_Francisco").get();
//select all "next siblings" of the "Get around" h2
Elements section = doc.select("h2:contains(Get around) ~ *");
//select all "next siblings" of the "See" h2 and remove them
section.select("h2:contains(See) ~ *").remove();
//remove the second h2
section.select("h2").remove();
//section now contains the elements between "Get around" and "See"
String sectionHtml = section.html();

使用jQuery做同样的事后,这是一些Firebug输出:第一个选择器返回一个包含这些Element的Elements对象:

[h3, p, p, p, p, h3, p, p, p, h3, div.thumb, div.thumb, p, ul, p, p, p, p, p, p, p, div.thumb, ul, ul, div.thumb, ul, ul, p, ul, ul, h3, p, p, p, h3, p, p, p, h3, p, p, p, p, p, p, h2, p, p, ul, ul, ul, h3, p, ul, h3, div.thumb, p, p, p, h3, div.thumb, p, p, p, p, p, h3, p, p, p, p, h3, div.thumb, p, p, p, p, p, h2, h3, div.thumb, p, p, p, p, p, ul, h3, div.thumb, ul, ul, ul, ul, ul, h3, p, h4, ul, h4, ul, h4, p, ul, h4, ul, h3, div.thumb, p, p, p, h3, p, h2, p, p, h2, p, p, p, h2, dl, p, p, p, p, h2, div.thumb, dl, p, p, p, h2, dl, h3, p, p, p, p, p, p, h3, p, ul, p, p, h2, dl, p, p, p, h2, p, p, p, p, h2, p, p, p, p, p, p, h2, p, p, p, p, h2, h3, ul, h3, ul, ul, ul, ul, ul, ul, ul, ul, ul, ul, ul, ul, ul, ul, ul, ul, ul, ul, ul, ul, ul, ul, ul, ul, ul, h2, p, p, ul, p, div.route_box, p, p, p, p, p, table, p, div, p, p, p, p]

第一个h3说“导航”而最后一个p包含<br>(奇怪的HTML,是的)。第二个选择和删除削减了它:

[h3, p, p, p, p, h3, p, p, p, h3, div.thumb, div.thumb, p, ul, p, p, p, p, p, p, p, div.thumb, ul, ul, div.thumb, ul, ul, p, ul, ul, h3, p, p, p, h3, p, p, p, h3, p, p, p, p, p, p, h2]

第一个h3仍然是“导航”,最后一个h2是您参考的“看到”。 select(“h2”)和remove导致了这个:

[h3, p, p, p, p, h3, p, p, p, h3, div.thumb, div.thumb, p, ul, p, p, p, p, p, p, p, div.thumb, ul, ul, div.thumb, ul, ul, p, ul, ul, h3, p, p, p, h3, p, p, p, h3, p, p, p, p, p, p]

其中包含“Get around”h2和“See”h2之间的所有元素。