[英]Building Strings by scraping html with JSoup
我是一名新手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>
之后拆分的String数组,然后使用以下代码处理数组:
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或每个页面的结构的情况下,这里有一些基本方法:
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类似,可以选择Artitst和Title,如下所示:
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.