使用jsoup解析JavaScript

Parse JavaScript with jsoup

本文关键字:JavaScript 解析 jsoup 使用      更新时间:2023-09-26

HTML页面中,我想要选择javascript变量的值
以下是HTML页面的片段:

<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可能吗?如果是,那么怎么做?

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

A。使用javascript库

  • Pro:

    • 完全支持Javascript
  • Con:

    • 其他库/依赖项

B。使用J汤+手动解析

  • Pro:

    • 不需要额外的库
    • 足够做简单的任务
  • Con:

    • 不如javascript库灵活

以下是如何使用jsoup和一些"手动"代码获得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

Kotlin问题被标记为重复,并指向此问题
下面是我如何与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()