在 Android WebView 中过滤 DOM 元素,而无需 jQuery

Filter DOM elements in Android WebView without jQuery

本文关键字:jQuery 元素 DOM Android WebView 过滤      更新时间:2023-09-26

我有一个安卓应用程序,可以从网络上检索和下载音频。

到目前为止,我所做的是使用 webview.loadUrl("some javascript code") 获取WebView上显示的下载链接。

我想做的是获取下载链接的href属性并将其存储为String

但我有两个问题:

首先,有几个没有 id 或类的锚标记都在 id 为 "dl_links" 的div 下。所有这些锚标签都有一个 href 属性,但除了正确的下载链接之外,所有这些锚标签都有 display:none .我不知道如何在不使用jQuery的情况下选择它。

其次,由于下载链接是

JavaScript 加载的,因此显示下载链接之前和之后的网站 url 是相同的。起初我打算使用 jsoup 来提取我需要的 href 属性,但由于加载网页后的 url 是相同的,我不确定该怎么做。

我不明白你关于无法使用jSoup的第二部分,因为URL是相同的? 你能更好地解释一下吗?

无论如何,使用jSoup提取链接真的很容易。

Document doc = Jsoup.parse(pageHTML);

    Elements pageLinks = doc.select("div#dl_links a");
    ArrayList<String> theLinks;
    theLinks= new ArrayList<String>(pageLinks.size());
    if (pageLinks.size() > 0) {
        for (Element lnk : theLinks) {
             if (lnk.attr("style").contains("display:none"))
             {
            theLinks.add(lnk.attr("href"));
              }
        }
    }

编辑

您也可以通过执行以下操作来缩短结果...

 doc.select("div#dl_links a[style*=display:none]")

编辑 2

由于您需要在javascript之后获取信息,那么您将想要做这样的事情...

  WebView.loadUrl("javascript:(function() { document.querySelectorAll('"button[type='submit']'")[0].click();})()");

上面的内容将单击需要单击的项目,以便显示新的 HTML。 您可能需要暂停或线程睡眠,以确保新文本已显示。 该程序是WebView没有允许您只阅读新HTML的好方法,因此如果您需要等到该特定文本出现在页面上,则需要研究这些方法,如果按下按钮后需要一段时间才能加载到页面上。

这不是一项"容易"的任务。 您可能希望参考此页面以获取想法和概念:如何从Web视图获取html内容?

一旦你完成了返回的HTML,那么你只需要在页面的HTML上做jSoup。

var dlHolder = document.getElementById('dl_links').querySelectorAll('a');
for (var i = 0; i < dlHolder.length; i++) {
  if (dlHolder[i].tagName == 'A') {
    if (dlHolder[i].style.display === 'none') {
      alert(dlHolder[i].getAttribute('href'));
    }
  }
}
.hidden {
  display: none;
}
<div id="dl_links">
  <a href="#1">a1</a>
  <a href="#2">a2</a>
  <a href="#3">a3</a>
  <a href="#4" class="hidden">a4</a> <!-- doesn't work -->
  <a href="#5" style="display:none">a5</a> <!-- this should work -->
</div>
<a href="#6" style="display:none">a6</a> <!-- outside div -->