2

我正在使用 Jsoup 解析 html 文件并从元素中提取所有可见文本。问题是 javascript 变量中有一些 html 位显然被忽略了。将这些位取出的最佳解决方案是什么?

例子:

<!DOCTYPE html>
<html>
<head>
    <script>
        var html = "<span>some text</span>";
    </script>
</head>
<body>
    <p>text</p>
</body>
</html>

在这个例子中,Jsoup 只从p标签中提取文本,这是它应该做的。如何从var htmlspan 中获取文本?该解决方案必须应用于数千个不同的页面,因此我不能依赖于具有相同名称的 javascript 变量之类的东西。

4

2 回答 2

5

您可以使用 Jsoup 将所有<script>-tags 解析为DataNode-objects。

DataNode

一个数据节点,用于样式、脚本标签等内容,其中内容不应显示在 text() 中。

 Elements scriptTags = doc.getElementsByTag("script");

这将为您提供 tag 的所有元素<script>

然后,您可以使用getWholeData()- 方法提取节点。

// Get the data contents of this node.
String    getWholeData() 
 for (Element tag : scriptTags){                
        for (DataNode node : tag.dataNodes()) {
            System.out.println(node.getWholeData());
        }        
  }

Jsoup API - 数据节点

于 2013-07-29T11:42:33.730 回答
1

我不太确定答案,但我在这里看到过类似的情况。

您可能可以使用 Jsoup 和手动解析来根据该答案获取文本。

我只是针对您的具体情况修改那段代码:

Document doc = ...
Element script = doc.select("script").first(); // Get the script part


Pattern p = Pattern.compile("(?is)html = \"(.+?)\""); // Regex for the value of the html
Matcher m = p.matcher(script.html()); // you have to use html here and NOT text! Text will drop the 'html' part


while( m.find() )
{
    System.out.println(m.group()); // the whole html text
    System.out.println(m.group(1)); // value only
}

希望它会有所帮助。

于 2013-11-02T04:16:53.213 回答