使用JSoup解析HTML构建字符串

4
我是一名新手Java程序员,现在开始进入库、API等领域。我已经有了一个相对简单的想法,可以作为我的个人项目,用于完成作业之余。
我对从几个不同网站爬取HTML并构建类似于“艺术家-“曲目名称”“的字符串很感兴趣。我已经让一个网站按照我想要的方式工作了,但我觉得这可以更加顺畅...以下是我在网站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>

接下来,我创建一个字符串数组,将每一行在最后一个</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 cookbook和API指南。我觉得我遇到麻烦的一部分原因也可能源于我对网页编码方式的相对有限的了解,尽管这可能主要是我对如何将这些代码插入Jsoup的理解方面存在问题。
感谢任何帮助或指导,我必须说,在这里问一个非作业问题真的很不错(尽管我从别人问的问题中找到了很多线索!;))
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:

与页面A类似,可以像这样选择艺术家和标题:

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

这里有一个关于Jsoup Selector API的良好概述:http://jsoup.org/cookbook/extracting-data/selector-syntax


谢谢你的回答...我肯定打算使用“if”检查来确定使用哪个站点 - 只是先尝试分别处理它们。 我还没有在我的代码中实现良好的面向对象设计。 还需要几天时间才能再次尝试,但会尝试您的建议。 昨天我还从Codeschool学习了一些关于JQuery选择器语法的知识,这让我受益匪浅。 看起来选择器之间有一些交叉! - taylor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接