用jsoup解析HTML:Android和Java的区别

用jsoup解析HTML:Android和Java的区别,java,android,html,parsing,jsoup,Java,Android,Html,Parsing,Jsoup,我在使用jsoup时遇到了问题,因为我已经用Java编写了用于解析网站中的一些信息的代码,并且工作得非常好。 但是我复制了Android中的代码(将其封装在asyncTask中),但是该文档与使用jsoup.connect() 为什么? 一些代码行是: Document doc = null; try { doc=Jsoup.connect("myurl").timeout(10000).get(); } catch (IOException e) { e.printStackT

我在使用jsoup时遇到了问题,因为我已经用Java编写了用于解析网站中的一些信息的代码,并且工作得非常好。
但是我复制了Android中的代码(将其封装在asyncTask中),但是该文档与使用
jsoup.connect()

为什么?

一些代码行是:

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的完整代码

爪哇

这是ANDROID代码(我在AndroidManifest中包含了互联网权限) 安卓

公共类MainActivity扩展活动{
//Campi necessari per il解析器HTML
字符串ProductName=“”;
字符串说明=”;
字符串LongDescription=“”;
字符串类别=”;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
HttpHTML task3=新的HttpHTML();
task3.execute();
}
公共类HttpHTML扩展异步任务{
@凌驾
受保护的void onPreExecute(){
}
@凌驾
受保护的Void doInBackground(Void…参数){
单据单据=空;
试一试{
doc=Jsoup.connect(“http://eandata.com/lookup/9788820333584/)超时(10000).get();
}捕获(IOE异常){
e、 printStackTrace();
}
//Accedo all'elemento del documento
元素体=doc.body();
System.out.println(body.text());
//普伦多·莱门托·菲格里奥·德尔·博迪酒店
元素figlio=body.child(0);
System.out.println(figlio.text());
元素span_Elements=figlio.getElementsByTag(“span”);
对于(元素p:span_元素){
if((p.id().compareTo(“”)==0 | | p.id()==null){
继续;
}
else if(p.id().compareTo(“upc_产品_o”)==0){
ProductName=p.text();
继续;
}
else if(p.id().compareTo(“upc_产品描述”)==0){
Description=p.text();
继续;
}
else if(p.id().compareTo(“upc\U prod\U cat\U path\U o”)==0){
类别=p.text();
继续;
}
else if(p.id().compareTo(“upc\u prod\u url\u o”)==0){
继续;
}
else if(p.id().compareTo(“upc\u prod\u long\u desc\u o”)==0){
LongDescription=p.text();
继续;
}
}
System.out.println(产品名称);
系统输出打印项次(说明);
系统输出打印项次(类别);
System.out.println(长描述);
返回null;
}
@凌驾
受保护的void onProgressUpdate(void…值){
}
@凌驾
受保护的void onPostExecute(void结果){
}
}
}

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


确保在生成请求时指定用户代理。详见文档。我通常将其设置为当前浏览器。

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

试着分析这个。另外一个好处是返回的数据集更小,使用的内存更小,在android上可能更快

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

到底是什么问题?Android应用程序是用Java编写的,Jsoup设计用于Android。如果代码在其他地方工作,它也应该在这里工作。代码在Java中完全工作,但在Android中,文档的解析方式不同。我在调试android时分析了文档文档,发现了文档中的差异,因为在android中,文档中并没有包含文档的所有标记范围。我用.useragent(“”)解决了添加useragent的问题。谢谢。@Giulio-很高兴这解决了这个问题。您可能希望接受/投票此答案,以便其他人知道答案已完成。
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) {

        }

    }




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