使用 jsoup 解析 JavaScript

IT技术 javascript java html kotlin jsoup
2021-01-21 11:58:13

在一个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>

我的目标是key使用jsoup.
有可能jsoup吗?如果是,那么如何?

2个回答

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

A. 使用 javascript 库

  • 亲:

    • 完整的 Javascript 支持
  • 骗局:

    • 附加库/依赖项

B.使用Jsoup+手动解析

  • 亲:

    • 不需要额外的库
    • 足以完成简单的任务
  • 骗局:

    • 不如 javascript 库灵活

这是一个如何key使用 jsoup 和一些“手动”代码的示例

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
请尝试(?s)\\.init\\(\\{(.+?)\\}\\);- 组 #1 包含requiredJsonObjectAsAnArgument.
2021-03-16 11:58:13
如果我有类似abc.xyz.init({requiredJsonObjectAsAnArgument});脚本标签的内容并且我只想解析 requiredJsonObjectAsAnArgument怎么办你能建议我适用于这种情况的正则表达式吗?
2021-03-20 11:58:13
你可以使用这个表达式来代替:(?s)(keyArray)\\s??=\\s??\\[(.*?)\\]如果定义了两个组:组 1 = 变量名称,组 2 = 值(在 内的那些[ ])。
2021-03-29 11:58:13
嘿,这Jsoup + manual parsing是一个很好的解决方案,但在我使用 js 变量作为数组时中断了。eg: keyArray = [1, 2, 3]你能给我解决这个问题吗?
2021-04-02 11:58:13

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()