我是一名 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()+ "”";
}
这是一种获取 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 的理解有问题。
我很感激任何帮助或指导,我不得不说,在这里问一个非家庭作业的问题真的很好(尽管我从其他人的问题中找到了很多提示!;))
最佳答案
常用:
如果您有一些不同的网站,您希望在其中解析内容,最好在它们之间进行区分。也许您可以决定是通过 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
关于java - 通过使用 JSoup 抓取 html 来构建字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13337986/