【问题标题】:Parse JavaScript with jsoup使用 jsoup 解析 JavaScript
【发布时间】:2013-02-01 00:32:45
【问题描述】:

HTML 页面中,我想选择javascript 变量的值。
下面是HTML页面的sn-p:

<input id="hidval" value="" type="hidden"> 
<form method="post" style="padding: 0px;margin: 0px;" name="profile" autocomplete="off">
<input name="pqRjnA" id="pqRjnA" value="" type="hidden">
<script type="text/javascript">
    key="pqRjnA";
</script>

我的目标是使用jsoup从此页面读取变量key的值。
jsoup 可以吗?如果是那怎么办?

【问题讨论】:

  • 您必须获取脚本内容,然后手动解析,或者查看是否可以使用 Rhino 从执行的 JS 片段中获取上下文。
  • @Reimeus:没有。初始化可以在其他地方完成,一些值被分配给变量key
  • 添加了 kotlin 标记,因为 similar Koltlin question 被标记为重复并链接到此问题。

标签: javascript java html kotlin jsoup


【解决方案1】:

由于 jsoup 不是 javascript 库,您有两种方法可以解决此问题:

A.使用 javascript 库

  • 专业版:

    • 完整的 Javascript 支持
  • 缺点:

    • 其他库/依赖项

B.使用Jsoup + 手动解析

  • 专业版:

    • 不需要额外的库
    • 简单的任务就足够了
  • 缺点:

    • 不如 javascript 库灵活

这里有一个示例如何使用 jsoup 和一些 "manual" 代码获取key

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


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


while( m.find() )
{
    System.out.println(m.group()); // the whole key ('key = value')
    System.out.println(m.group(1)); // value only
}

输出(使用您的 html 部分):

key="pqRjnA"
pqRjnA

【讨论】:

  • 嘿,Jsoup + manual parsing 是很好的解决方案,但是在我使用 js 变量作为数组时会中断。 eg: keyArray = [1, 2, 3]你能给我解决办法吗。
  • 您可以改用这个正则表达式:(?s)(keyArray)\\s??=\\s??\\[(.*?)\\]。如果定义了两个组:组 1 = 变量名,组 2 = 值([ ] 内的那些)。
  • 如果我在脚本标签中有 abc.xyz.init({requiredJsonObjectAsAnArgument}); 之类的东西,我只想解析 requiredJsonObjectAsAnArgument。你能建议我适用于这种情况的正则表达式吗?
  • 请尝试(?s)\\.init\\(\\{(.+?)\\}\\); - 组#1 包含requiredJsonObjectAsAnArgument
【解决方案2】:

Kotlin question 被标记为重复并指向此问题。
所以,这就是我使用 Kotlin 的方法:

val (key, value) = document
    .select("script")
    .map(Element::data)
    .first { "key" in it } // OR single { "key" in it }
    .split("=")
    .map(String::trim)
val pureValue = value.replace(Regex("""["';]"""), "")
println("$key::$pureValue") // key::pqRjnA

另一个版本:

val (key, value) = document
    .select("script")
    .first { Regex("""key\s*=\s*["'].*["'];""") in it.data() }
    .data()
    .split("=")
    .map { it.replace(Regex("""[\s"';]"""), "") }
println("$key::$value") // key::pqRjnA

脚注

要获取文档,您可以这样做:

  • 来自文件:
    val input = File("my-document.html")
    val document = Jsoup.parse(input, "UTF-8")
    
  • 从服务器:
    val document = Jsoup.connect("the/target/url")
        .userAgent("Mozilla")
        .get()
    

【讨论】:

    猜你喜欢
    • 2017-03-02
    • 1970-01-01
    • 2014-07-30
    • 2012-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多