3

http://wikitravel.org/en/San_Franciscoのようなサイトでは、「地区」、「理解」、「参加」などのセクションは、実際には HTML のセクション全体を含んでいません。セクションは、実際には見出し内の複数のクラスにまたがっています。このため、ID を選択するだけでは Wiki ドキュメントの特定のセクションを取得することはできません。

しかし、2 つのタグの間のすべての html を収集することは可能ですか? 「Get around」セクションが欲しかったとしましょう。間のすべての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 の次の兄弟をすべて選択してから、2 番目の 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 ですね) が含まれています。2 番目の選択と削除では、次のように削減されました。

[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 に答える