4

私は初心者の Java プログラマーで、ライブラリーや API などの世界に進出し始めたばかりです。私は、比較的単純なアイデアを思いついたところに来ており、宿題に取り組んでいないときのお気に入りのプロジェクトになることができます.

いくつかの異なるサイトから html をスクレイピングして、" Artist - "Track Name" " のような文字列を作成することに興味があります。希望どおりに機能しているサイトが 1 つありますが、もっとスムーズにできると思います... サイト A で私が行っていることの概要は次のとおりです。

次のように、クラス plrow のすべての要素を JSoup に作成させます。

<p class="plrow"><b><a href="playlist.php?station=foo">Artist</a></b> “Title” (<span class="sn_ld"><a href="playlist.php?station=foo">Label</a></span>) <SMALL><b>N </b></SMALL></p></td></tr><tr class="ev"><td><a name="98069"></a><p class="pltime">Time</p>

そこから、最後の の後で分割された行の String 配列を作成し</p>、次のコードを使用して配列を処理します。

for (int i = 0; i < tracks.length; i++){
            tracks[i] = Jsoup.parse(tracks[i]).text();
            tracks[i] = tracks[i].split("”")[0];
            tracks[i] = tracks[i].toString()+ "”";          
        }

これは、私が望む方法を取得するためのかなりハックな方法Artist "Title"ですが、結果は私にとっては問題ありません。

サイト B は少し異なります。

アーティストとタイトルはすべて次のように含まれていると判断しました。 <span class="artist" property="foaf:name">Artist Name</span> </a> </span> <span class="title" property="dc:title">Title</span>

より多くの情報とともに、すべての内部<li id="segmentevent-random" class="segment track" typeof="po:MusicSegment" about="/url"> song info </li>

最初にすべてのアーティストを調べて、次にタイトルを取得してから 2 つをマージしようとしていましたが、トラックのタイトルを表示するために使用される「dc:title」プロパティが他の非表示に使用されるため、問題が発生しました。音楽的なものなので、アーティストとトラックを直接一致させることはできません.

私は今週末、Jsoup でタグ付けされた数え切れないほどの質問を表示し、Jsoup のクックブックと API ガイドを読むことに多くの時間を費やして、これを機能させるために大部分を費やしました。私の問題の一部は、Web ページがどのようにコーディングされているかについての比較的限られた知識に起因する可能性もあると感じています。

ヘルプやガイダンスに感謝します。ここで宿題以外の質問をするのは本当にいいことです (ただし、他の人が尋ねたことからかなりのヒントを見つけることができます! ;) )

4

1 に答える 1

1

一般:

コンテンツを解析したいいくつかの異なる Web サイトがある場合は、それらを区別することをお勧めします。ページ A とページ B のどちらを URL で解析するかを決めることができるかもしれません。

例:

if( urlToPage.contains("pagea.com") )
{
    // Call parsemethod for Page A or create parserclass
}
else if( urlToPage.contains("pageb.com") )
{
    // Call parsemethod for Page B or create parserclass
}
// ... 
else
{
    // Eg. throw Exception because there's no parser available
}

次の 1 行のコードで、各ページを結合してドキュメントに解析できます。

// Note: the protocol (http) is required here
Document doc = Jsoup.connect("http://pagewhaterver.com").get(); 

Html や各ページの構造を知らなくても、いくつかの基本的なアプローチを次に示します。

ページ A:

for( Element element : doc.select("p.plrow") )
{
    String title = element.ownText();                           // Title - output: '“Title” ()' (you have to replace the " and () here)
    String artist = element.select("a").first().text();         // Artist
    String label = element.select("span.sn_ld").first().text(); // Label

    // etc.
}

ページ B:

ページ B と同様に、Artitst と Title は次のように選択できます。

String artist = doc.select("span.artist").first().text();
String title = doc.select("span.title").first().text();

Jsoup セレクター API の概要は次のとおりです: http://jsoup.org/cookbook/extracting-data/selector-syntax

于 2012-11-12T17:42:50.263 に答える