【问题标题】:Parsing HTML with jsoup: differences between Android and Java用jsoup解析HTML:Android和Java的区别
【发布时间】:2025-11-23 01:20:05
【问题描述】:

我在使用 jsoup 时遇到了问题,因为我已经用 Java 编写了用于解析来自网站的一些信息的代码并且可以完美运行。
但是我在 Android 中复制代码(将其封装在 asyncTask 中)但文档与使用 jsoup.connect() 解析的 doc Java 不同。
为什么?

一些代码行是:

Document doc = null;
try {
    doc=Jsoup.connect("myurl").timeout(10000).get();
} catch (IOException e) {
    e.printStackTrace();
}

Element body = doc.body();      
Element figlio = body.child(0);     
Elements span_elements = figlio.getElementsByTag("span");

我在这里发布了完整的java和android代码。

JAVA

public class MainClass {

    public static void main(String[] args){
            String ProductName = "";
            String Description = "";
            String LongDescription = "";
            String Category = "";

Document doc = null;
        try {
                                                                                     doc=Jsoup.connect("http://eandata.com/lookup/9788820333584/").timeout(10000).get();

        } catch (IOException e) {
            e.printStackTrace();
        }

        Element body = doc.body();

        Element figlio = body.child(0);

        Elements span_elements = figlio.getElementsByTag("span");

        for(Element p : span_elements) {

            if((p.id().compareTo("")) == 0 || p.id() == null) {
                continue;
            }

            else if(p.id().compareTo("upc_prod_product_o") == 0) {
                ProductName = p.text();
                continue;
            }

            else if(p.id().compareTo("upc_prod_description_o") == 0) {
                Description = p.text();
                continue;
            }

            else if(p.id().compareTo("upc_prod_cat_path_o") == 0) {
                Category = p.text();
                continue;
            }

            else if(p.id().compareTo("upc_prod_url_o") == 0) {
                continue;
            }

            else if(p.id().compareTo("upc_prod_long_desc_o") == 0) {
                LongDescription = p.text();
                continue;
            }

        }

        System.out.println(ProductName);
        System.out.println(Description);
        System.out.println(Category);
        System.out.println(LongDescription);

这是代码 ANDROID(我已在 AndroidManifest 中包含 INTERNET PERMISSION) 安卓

public class MainActivity extends Activity {

    //Campi necessari per il Parser HTML
        String ProductName = "";
        String Description = "";
        String LongDescription = "";
        String Category = "";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        HttpHTML task3 = new HttpHTML();
        task3.execute();
    }

    public class HttpHTML extends AsyncTask<Void,Void,Void> {

        @Override
        protected void onPreExecute() {
        }

        @Override
        protected Void doInBackground(Void...params) {
            Document doc = null;
            try {
                 doc=Jsoup.connect("http://eandata.com/lookup/9788820333584/").timeout(10000).get();
            } catch (IOException e) {
                e.printStackTrace();
            }

            //Accedo all'elemento <body> del documento
            Element body = doc.body();
            System.out.println(body.text());

            //Prendo l'elemento figlio del body
            Element figlio = body.child(0);
            System.out.println(figlio.text());

            Elements span_elements = figlio.getElementsByTag("span");

            for(Element p : span_elements) {

                if((p.id().compareTo("")) == 0 || p.id() == null) {
                    continue;
                }

                else if(p.id().compareTo("upc_prod_product_o") == 0) {
                    ProductName = p.text();
                    continue;
                }

                else if(p.id().compareTo("upc_prod_description_o") == 0) {
                    Description = p.text();
                    continue;
                }

                else if(p.id().compareTo("upc_prod_cat_path_o") == 0) {
                    Category = p.text();
                    continue;
                }

                else if(p.id().compareTo("upc_prod_url_o") == 0) {
                    continue;
                }

                else if(p.id().compareTo("upc_prod_long_desc_o") == 0) {
                    LongDescription = p.text();
                    continue;
                }

            }

            System.out.println(ProductName);
            System.out.println(Description);
            System.out.println(Category);
            System.out.println(LongDescription);

            return null;
        }

        @Override
        protected void onProgressUpdate(Void... values) {
        }

        @Override
        protected void onPostExecute(Void result) {

        }

    }




}

【问题讨论】:

  • 到底是什么问题? Android 应用程序是用 Java 编写的,而 Jsoup 旨在用于 Android。如果代码在其他地方工作,它也应该在这里工作。
  • 代码在 Java 中完全可以工作,但在 Android 中,文档文档的解析方式不同。我在调试 android 时分析了文档 doc,我发现了 doc 中的差异,因为在 Android 中并非文档的所有标签跨度都包含在 doc 中。

标签: java android html parsing jsoup


【解决方案1】:

在不知道您访问的 URL 的情况下,这只是一个猜测,但我敢打赌 5 美元我是对的:服务器正在根据您的用户代理字符串发回不同的 HTML,并且因为您没有明确说明设置它,它是默认的。并且Android和Java之间的默认值是不同的。服务器试图提供帮助,并为您提供针对 Android 的移动优化 HTML。

确保在构建请求时指定用户代理。有关详细信息,请参阅 Connection.userAgent() 文档。我通常将其设置为我当前的浏览器。

【讨论】:

  • 我解决了使用 .userAgent("") 添加用户代理的问题。谢谢。
  • @Giulio - 很高兴这解决了这个问题。您可能希望接受/投票此答案,以便其他人知道它已完成。
【解决方案2】:

非常有趣的问题。如果您查看网站,信息中有趣的部分是动态加载的。 Jsoup 不应该解析这部分。我不明白为什么它在android上的工作方式不同。但这并不重要。我找到了加载有趣信息的网址。

尝试解析这个。额外的好处是它返回的数据集更小,它使用更小的内存,并且在 android 上可能更快。

http://eandata.com/lookup.php?extra=x&code=9788820333584&mode=prod&show=&force_amazon=&ajax=1

【讨论】:

    最近更新 更多