java - 通过使用 JSoup 抓取 html 来构建字符串

标签 java 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> 之后被拆分,然后使用下面的代码来处理数组:

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/

相关文章:

java - 如何使用 Jsoup 获取元素的 CSS 选择器?

java - 在 Java 中查找嵌套匹配的 HTML 标签

java - 使用 Jsoup 的特定标记后的 HTML 内容

java - 旋转 PVector

java - 我们可以调试从intellij部署的azure函数吗?

java - 在 Android Studio v3.1.1 中生成构建 apk 时如何修复 checkReleaseBuilds false

java - 使用 jsoup 获取表的内容

java - 如何使用stripes框架安全地实现 "remember me in this computer"?

java - 如何查询具有多对多关系的实体?

configuration - 向 Intellij IDEA 添加外部 jar 库