【问题标题】:Get html of a website with retrofit - Android?获取带有改造的网站的 html - Android?
【发布时间】:2017-11-01 00:01:39
【问题描述】:

如何获取带有retrofit 的网站的html?

例如,我有这个url,我需要获取这个 url 的 html 以及如何加载更多。

下面是我的代码:

MainActivity.java:

public class MainActivity extends AppCompatActivity {
    TextView txt;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        txt = (TextView) findViewById(R.id.txt);

        OkHttpClient okHttpClient = new OkHttpClient().newBuilder()
                .build();

        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("https://www.instagram.com/elde0596/")
                .addConverterFactory(GsonConverterFactory.create())
                .client(okHttpClient)
                .build();

        final Interface_Web request = retrofit.create(Interface_Web.class);
        Call<ResponseBody> call = request.getHtml();
        call.enqueue(new Callback<ResponseBody>() {
            @Override
            public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
                txt.setText(response.body().source().toString());
                Log.i("SDADASDAWEQ", "A " + response.body().toString());
            }

            @Override
            public void onFailure(Call<ResponseBody> call, Throwable t) {
                Log.i("SDADASDAWEQ", "B " + t.getMessage());
            }
        });

    }
}

Interface_Web.java:

public interface Interface_Web {
    @GET("/")
    Call<ResponseBody> getHtml();
}

给我看看:

[size=9500 text=<!DOCTYPE html>\n<!--[if lt IE 7]>      <html lang="en" class="no…]

但我需要查看所有html

【问题讨论】:

  • 请说明您尝试了什么以及您的不足之处,请在此处输入一些代码
  • 我想要所有的 html 代码,但这里它要求标签名称来获取代码 sn-p。这是我的代码-> String html = response.body().string();文档 document = Jsoup.parse(html);元素 elements = document.select("name_of_tag_you want_to_get"); for (Element element:elements) { if (element.attr("name_of_attribute_you want to check").equals("value_of_the_attribute")){ } }
  • 谢谢它对我有帮助。并让我知道如何打印 html 的全部内容,根据您的解决方案,它只打印一行而不是整个 html 内容。请告诉我。谢谢!

标签: android retrofit retrofit2 androidhttpclient


【解决方案1】:

解决了我的问题:

public class SecondClass extends AppCompatActivity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.class_second);
        Dispatcher dispatcher = new Dispatcher(Executors.newFixedThreadPool(20));
        dispatcher.setMaxRequests(20);
        dispatcher.setMaxRequestsPerHost(1);

        OkHttpClient okHttpClient = new OkHttpClient.Builder()
                .dispatcher(dispatcher)
                .connectionPool(new ConnectionPool(100, 30, TimeUnit.SECONDS))
                .build();

        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(HttpUrl.parse("https://www.x.x/x/"))
                .addConverterFactory(PageAdapter.FACTORY)
                .build();

        PageService requestAddress = retrofit.create(PageService.class);
        Call<Page> pageCall = requestAddress.get(HttpUrl.parse("https://www.x.x/x/"));
        pageCall.enqueue(new Callback<Page>() {
            @Override
            public void onResponse(Call<Page> call, Response<Page> response) {
                Log.i("ADASDASDASD", response.body().content);
            }
            @Override
            public void onFailure(Call<Page> call, Throwable t) {

            }
        });
    }

    static class Page {
        String content;

        Page(String content) {
            this.content = content;
        }
    }

    static final class PageAdapter implements Converter<ResponseBody, SecondClass.Page> {
        static final Converter.Factory FACTORY = new Converter.Factory() {
            @Override
            public Converter<ResponseBody, ?> responseBodyConverter(Type type, Annotation[] annotations, Retrofit retrofit) {
                if (type == SecondClass.Page.class) return new SecondClass.PageAdapter();
                return null;
            }
        };

        @Override
        public SecondClass.Page convert(ResponseBody responseBody) throws IOException {
            Document document = Jsoup.parse(responseBody.string());
            Element value = document.select("script").get(1);
            String content = value.html();
            return new SecondClass.Page(content);
        }
    }

    interface PageService {
        @GET
        Call<SecondClass.Page> get(@Url HttpUrl url);
    }
}

【讨论】:

    【解决方案2】:

    我认为这会对您有所帮助。如果您将呼叫对象创建为ResponseBody,您可以获得这样的html:

    Call<ResponseBody> call = Interface_Web.getJSONSignIn(...)
    call.enqueue(new Callback<ResponseBody>() {
        @Override
        public void onResponse(Response<ResponseBody> response, Retrofit retrofit) {
            // access response code with response.code()
            // access string of the response with response.body().string()
        }
    
        @Override
        public void onFailure(Throwable t) {
            t.printStackTrace();
        }
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多