4

我是一名 Java 程序员新手,现在刚刚开始涉足库、API 等领域。我现在有一个相对简单的想法,当我不做作业时,它可以成为我的宠物项目。

我有兴趣从几个不同的站点抓取 html,并构建看起来像“Artist - “Track Name””的字符串。我有一个站点以我想要的方式工作,但我觉得它可以更顺利地完成......这是我为站点 A 所做的工作的概要:

我让 JSoup 为类 plrow 的所有内容创建元素,如下所示:

<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>

从那里,我创建了一个字符串数组,这些行在 last 之后被拆分</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()+ "”";          
        }

这是获得我想要的方式的一种非常hackish的方式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>

我试图先检查所有艺术家,然后是标题,然后将两者合并,但我遇到了麻烦,因为用于显示曲目标题的“dc:title”属性用于其他非音乐的东西,所以我不能直接将艺术家与曲目匹配。

这个周末我花了大部分时间试图通过查看无数用 Jsoup 标记的问题来解决这个问题,并花费大量时间阅读 Jsoup 食谱和 API 指南。我有一种感觉,我的部分问题也可能源于我对网页如何编码的知识相对有限,尽管这可能主要是我对如何将这些代码插入 Jsoup 的理解的问题。

我感谢任何帮助或指导,我不得不说,在这里问一个非家庭作业问题真的很好(尽管我从其他人的问题中找到了很多提示!;))

4

1 回答 1

1

常见的:

如果您有一些不同的网站要在其中解析内容,那么在它们之间进行区分是个好主意。也许您可以决定是通过 URL 解析页面 A 还是页面 B。

例子:

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
}

您可以使用一行代码将每个页面连接并解析为一个文档:

// 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页:

与 Page 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 回答