3

在像http://wikitravel.org/en/San_Francisco这样的网站上,“Districts”、“Understand”、“Get in”等部分实际上并不包含 HTML 中的整个部分。节实际上只是标题中的跨度类。因此,不能仅通过选择 id 来获取 wiki 文档的某些部分。

但是,是否可以收集两个标签之间的所有 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>

?

4

1 回答 1

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

于 2012-07-27T23:14:22.710 回答