有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java为什么我的Jsoup代码没有返回正确的元素?

我正在Android Studio中开发一个应用程序,在使用JSoup抓取网页时遇到了一些问题。我已经成功连接到该网页,并返回了一些基本元素来测试库,但现在我实际上无法获得我的应用程序所需的元素

我正在尝试获取一些具有“data at”属性的元素。奇怪的是,返回了几个带有“data at”属性的元素,但不是我要查找的元素。无论出于何种原因,我的代码没有提取网页上共享“data at”属性的所有元素

这是我正在抓取的网页的URL: https://express.liatoyotaofcolonie.com/inventory?f=dealer.name%3ALia%20Toyota%20of%20Colonie&f=submodel%3ACamry&f=trim%3ALE&f=year%3A2020

包含网页抓取代码的方法:

@Override
    protected String doInBackground(Void... params) {
        String title = "";
        Document doc;
        Log.d(TAG, queryString.toString());
        try {
            doc = Jsoup.connect(queryString.toString()).get();
            Elements content = doc.select("[data-at]");
            for (Element e: content) {
                Log.d(TAG, e.text());
            }
        } catch (IOException e) {
            Log.e(TAG, e.toString());
        }
        return title;
    }

Logcat中的结果

enter image description here

我要检索的元素

enter image description here

实际被检索的元素之一

enter image description here


共 (1) 个答案

  1. # 1 楼答案

    这是因为一些内容(包括您正在寻找的内容)是异步创建的,并且不存在于初始DOM(Javascript;)中

    当您查看页面的源代码时,您会注意到只有17个data-at出现,而在运行document.querySelector("[data-at]")时,会返回29个节点

    在JSoup中可以获得页面的静态内容(初始DOM)。由于没有运行所需的JS脚本,您将无法获取动态创建的内容

    为了克服这个问题,您必须手动获取和解析所需的资源(例如跟踪浏览器发出的AJAX调用),或者使用headless browser设置。硒+无头铬就足够了

    Letter选项将允许您删除任何可能的web应用程序,包括SPA应用程序,这是使用PlaingJSoup无法实现的