Страницы

Поиск по вопросам

понедельник, 23 декабря 2019 г.

Как парсить данные из WebView

#javascript #android #html #парсер #webview


Делаю мобильное приложение для сайта. Сайт не мой, API нет, поэтому его приходится
парсить. Думал обойдусь только JSOUP, но встал вопрос о том, как обрабатывать javascript
кнопки. Позадавав вопросы на англоязычном стаке мне сообщили, что с помощью JSOUP мне
не обработать javascript. 
Решил делать через WebView, но теперь столкнулся с проблемой -  как спарсить страничку
которая сейчас отображена в webview?
    


Ответы

Ответ 1



РЕШЕНИЕ: Пишем обработчик WebView и втыкаем туда Handler. Этот Handler будет драть для нас html странички сразу по завершении загрузки. У меня получилось примерно так: String shit; @JavascriptInterface @SuppressLint("SetJavaScriptEnabled") @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); webview = (WebView) findViewById(R.id.webView); webview.setWebViewClient(new MyWebViewClient()); webview.getSettings().setJavaScriptEnabled(true); webview.getSettings().setDomStorageEnabled(true); webview.getSettings().setSaveFormData(true); webview.getSettings().setSavePassword(true); webview.getSettings().setLoadsImagesAutomatically(false); webview.addJavascriptInterface(new MyJavaScriptInterface(), "HtmlHandler"); webview.setWebViewClient(new MyWebViewClient() { @Override public void onPageFinished(WebView view, String url) { webview.loadUrl("javascript:window.HtmlHandler.handleHtml" + "(''+document.getElementsByTagName('html')[0].innerHTML+'');"); } }); webview.getSettings().setUserAgentString("Chrome/41.0.2228.0 Safari/537.36"); webview.loadUrl("Ваш Сайт"); } Далее пишем класс MyJavaScriptInterface в котором мы распарсим выдернутую html страницу с помощью JSOUP: private class MyJavaScriptInterface { @JavascriptInterface public void handleHtml(String html) { Document doc = Jsoup.parse(html); shit = doc.select("span[id=j_id178]").first().text(); MainActivity.this.setTitle(shit); } } Естественно еще нужно подключить библиотеку JSOUP в файле build.gradle: dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) testCompile 'junit:junit:4.12' compile 'com.android.support:appcompat-v7:23.1.1' compile 'com.android.support:design:23.1.1' compile 'org.jsoup:jsoup:1.8.3' //вот наша библиотека } Все супер! Теперь заголовок моей Activity принял значение текста в этом id.

Комментариев нет:

Отправить комментарий