Java 如何从具有动态值的表中刮取数据?

Java 如何从具有动态值的表中刮取数据?,java,android,html,web-scraping,Java,Android,Html,Web Scraping,这可能是一个挑战,因为网站的建设者似乎试图阻止这一点 我正在尝试构建一个简单的应用程序来查看网站表中的一些数据。该表位于此处: 然而,表数据似乎是在页面加载之后加载的,所以当我试图获取表的HTML时,它是空的。如何获取包含数据的表格 我正在使用JSOUP刮表 private class GetData extends AsyncTask<String, Void, Element> { @Override protected Element doI

这可能是一个挑战,因为网站的建设者似乎试图阻止这一点

我正在尝试构建一个简单的应用程序来查看网站表中的一些数据。该表位于此处:

然而,表数据似乎是在页面加载之后加载的,所以当我试图获取表的HTML时,它是空的。如何获取包含数据的表格

我正在使用JSOUP刮表

private class GetData extends AsyncTask<String, Void, Element> {

        @Override
        protected Element doInBackground(String... params) {
            try {
                Document document = Jsoup.connect(params[0]).get();
                Log.e("Yiit",document+"");
                Element table = document.getElementById("dovizTablo");
                return table;
            } catch (Exception e) {
                e.printStackTrace();
            }

            return null;
        }

        @Override
        protected void onPostExecute(Element element) {
            super.onPostExecute(element);
            Log.e("Yiit",element+"");
            tvMain.setText(element+"");
        }
    }
私有类GetData扩展异步任务{
@凌驾
受保护元素doInBackground(字符串…参数){
试一试{
Document Document=Jsoup.connect(参数[0]).get();
Log.e(“Yiit”,document+”);
元素表=document.getElementById(“dovizTablo”);
返回表;
}捕获(例外e){
e、 printStackTrace();
}
返回null;
}
@凌驾
受保护的void onPostExecute(元素){
super.onPostExecute(元素);
Log.e(“Yiit”,元素+”);
tvMain.setText(元素+“”);
}
}
结果:

<table class="prices prices2" id="dovizTablo"> 
<thead> 
<tr> 
<th>D&ouml;viz Adı</th> 
<th>CEPTETEB Alış</th> 
<th>CEPTETEB Satış</th> 
</tr> 
</thead> 
<tbody> 
</tbody> 
</table>

Dö;即Adı
塞佩泰布酒店
塞佩泰布卫星
预期行为:

<table class="prices prices2" id="dovizTablo">
                            <thead>
                                <tr>
                                    <th>Döviz Adı</th>
                                    <th>CEPTETEB Alış</th>
                                    <th>CEPTETEB Satış</th>
                                </tr>
                            </thead>
                            <tbody>
                            <tr><td>USD</td><td>2.9096 TL</td><td>2.9908 TL</td></tr><tr><td>EUR</td><td>3.1555 TL</td><td>3.2435 TL</td></tr><tr><td>GBP</td><td>4.0558 TL</td><td>4.1688 TL</td></tr></tbody>
                        </table>

Döviz Adı
塞佩泰布酒店
塞佩泰布卫星
2.9096美元TL2.9908 TL3.1555 TL3.2435 TL4.0558 TL4.1688 TL

您提供的此站点使用javascript初始化数据。你不能用Jsoup刮它

我可以想出两种方法来刮掉这一页

  • 使用
    WebView
    访问页面,然后运行一些
    js
    来 解析所需内容并返回主应用程序。 阅读如何实现它

  • 创建一个web服务,该服务可以解析并返回此站点的数据

  • 网站的建设者似乎试图阻止这一点

    那么,你为什么要刮取数据

    相反,我建议您寻找另一个公开提供您所需数据的来源


    您还可以检查目标网站是否提供API。

    您能给我举一些关于如何创建上述web服务的示例吗?我在web开发方面不是很有经验。如果你有一个web服务器,那么你可以创建一个web应用程序来抓取页面。这可能对你有帮助。不幸的是,我没有,但我怎么能测试它是否有效呢?当我尝试在webview中加载页面时,表的内容没有加载。因此,他们可能以某种方式阻止了不寻常的浏览器?@user2741186如果您更改
    用户代理
    ?尝试使用Xpath--eg(//*[@id=“dovizTablo”]/tbody/tr[1]/td[1])--如何获取Xpath--因此,如果我理解正确,Xpath可用于轻松访问所需元素。然而,我并没有问题导航到表,它只是空的。所以xpath可能不会有任何帮助。您可能是对的,因为它听起来像是一个时间问题。Xpath获取元素中的内容。你试过在刮之前延迟2-3秒吗?