Java - 使用Jsoup获取script标签内的文本

25

我正在使用Jsoup库读取一个URL,这个URL包含在一些<script>标签中的文本。请问我是否可以获取每个<script>标签内的文本?请注意,我不是在请求解析Javascript文件,因为我已经知道JSoup不允许那样做。实际的源代码中有文本在一个script标签内,我需要它。

doc = Jsoup.connect("http://www.example.com").timeout(10000).get();

Element div = doc.select("script").first();
for (Element element : div.children()) {
System.out.println(element.toString());
}

这是源代码中一个脚本标签的样子:

<script type="text/javascript">
(function() {
...
})();
</script>
4个回答

29
是的,您可以使用Element#getElementsByTag()方法获取所有的script标签。每个脚本标签将由DataNode表示。
 Document doc =Jsoup.connect("https://dev59.com/IWQn5IYBdhLWcg3wgnXg").timeout(10000).get();
 Elements scriptElements = doc.getElementsByTag("script");

 for (Element element :scriptElements ){                
        for (DataNode node : element.dataNodes()) {
            System.out.println(node.getWholeData());
        }
        System.out.println("-------------------");            
  }

谢谢@KenChan,它完美地工作了,我正在使用String scriptdata = node.getWholeData(); 但是如何只获取页面上的第二个脚本? - Florida

29

或者,你可以使用 Element#html() 方法来返回元素的内部 html。

自 1.11.1 版本起使用高效的 Element#selectFirst() 方法查找脚本元素。

Document doc = Jsoup.connect("http://www.example.com").timeout(10000).get();
Element scriptElement = doc.selectFirst("script");
// 不要忘记检查 scriptElement 不为 null...
String jsCode = scriptElement.html();

Jsoup 1.10.3 及之前版本结合 Element#select()Elements#first() 方法调用以查找脚本元素。

Document doc = Jsoup.connect("http://www.example.com").timeout(10000).get();
Element scriptElement = doc.select("script").first();
// 不要忘记检查 scriptElement 不为 null...
String jsCode = scriptElement.html();

9
Document doc = Jsoup.parse(html);
Elements scripts = doc.getElementsByTag("script");
for (Element script : scripts) {
    System.out.println(script.data());
}

2
尽管这段代码可能回答了问题,但提供有关它为什么和/或如何回答问题的额外背景信息将显着提高其长期价值。请 [编辑] 您的回答以添加一些说明。 - Toby Speight

3
根据您的情况,解决方案如下。
Document doc = Jsoup.connect("http://www.example.com").timeout(10000).get();
Elements scripts = doc.select("script");

for (Element script : scripts) {
    String type = script.attr("type");
    if (type.contentEquals("text/javascript")) {
        String scriptData = script.data(); // your text from the script
        break;
    }
}

你可以使用“cssQuery”语法简化代码,如下所示:Elements scripts = doc.select("script[type=text/javascript]"); - Tanzer

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