Jsoup 没有完全获取原始 html 代码

Posted

技术标签:

【中文标题】Jsoup 没有完全获取原始 html 代码【英文标题】:Jsoup doesn't fully fetch the raw html code 【发布时间】:2021-04-28 14:18:28 【问题描述】:

我正在尝试从genius.com 获取一些歌词(我知道他们有一个 api。我正在手动进行。)但我似乎每次都没有得到相同的 html 字符串。事实上我把下面的代码放在一个 for 循环,它似乎只在 %50 的时间内工作。

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import java.io.IOException;

public class Fetch_lyrics 
    public static void testing() 
        try 

            String urll = "https://genius.com/In-mourning-debris-lyrics";;
            Document doc = Jsoup.connect(urll).maxBodySize(0).get();
            String text = doc.select("p").first().toString();
            System.out.println(text);

         catch (IOException e) 
            e.printStackTrace();
        
    

我通过 doc 变量打印了原始 html,似乎大约 50% 的时间原始 html 字符串没有包含歌词的 <p> 类(idk,如果它被称为类或其他东西)。谢谢提前。

【问题讨论】:

可能相关:Page content is loaded with javascript and Jsoup doesn't see it 【参考方案1】:

看起来天才网站为新用户返回了不同的内容。我第一次来的时候得到了两个不同的内容,当我在浏览器 (Chrome) 中清除 cookie 并再次访问时。

我建议你添加两个选择器来获取你需要的信息。

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;

import java.io.IOException;

class Outer 

    public static void main(String[] args) 
        try 
            String urll = "https://genius.com/In-mourning-debris-lyrics";
            Document doc = Jsoup.connect(urll).maxBodySize(0).get();
            Element first = doc.selectFirst("p");
            if (first == null) 
                first = doc.selectFirst("div[class^=Lyrics__Container]");
            
            if (first != null) 
                System.out.println(first.text());
            
         catch (IOException e) 
            e.printStackTrace();
        
    

【讨论】:

以上是关于Jsoup 没有完全获取原始 html 代码的主要内容,如果未能解决你的问题,请参考以下文章

如何使用java获取“检查元素”(Chrome)代码?

Jsoup超时没有获取数据

使用Jsoup进行语法分析时,保持HTML布尔属性的原始形式

如何从 html 中只获取没有垃圾的文本?

数组是原始类型还是对象(或完全是其他东西)?

Jsoup,一款超好用的HTML文本解析Java工具