saveWebArchive() некорректно сохраняет страницу из WebView

174
07 марта 2018, 06:17

Пользователь вставляет в приложение ссылку на определённый сайт. Эта ссылка загружается в невидимый WebView и после прогрузки сохранятся в память телефона. Далее идёт парсинг данных с помощью JSoup.

Проблема заключается в том, что страница сохраняется некорректно и я не могу достать необходимые данные, получая при этом NPE.

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String org.jsoup.nodes.Element.text()' on a null object reference

Так выглядит страница, сохранённая через saveWebArchive() - https://dl2.pushbulletusercontent.com/QlqY6H8pnm5zHKS8pGm1TRM2Y1vkRKcs/aaa.html

А так через браузер на ПК - https://dl2.pushbulletusercontent.com/yWMc1H92D61fXjlhEfA5haK9bVpIPeil/apkk.html

Если скормить парсеру эту страницу, то всё происходит без проблем, все данные на месте.

@Override
    protected void onCreate(Bundle savedInstanceState) {
        setTheme(LocaleUtils.noDrawerStyleId);
        super.onCreate(savedInstanceState);
        setContentView(R.layout.elr_parcer_activity_layout);
        webView = findViewById(R.id.webView);
        webView.loadUrl("http://e-liquid-recipes.com/recipe/942182/Cold+Strawberry+");
        webView.getSettings().setJavaScriptEnabled(true);
        webView.setWebViewClient(new WebViewClient() {
            public void onPageFinished(WebView view, String url) {
                webView.saveWebArchive("storage/emulated/0/Download/aaa.html");
            }
        });
        RecipeParcer recipeParcer = new RecipeParcer();
        recipeParcer.execute();;
    }
    static class RecipeParcer extends AsyncTask {
        @Override
        protected Object doInBackground(Object[] objects) {
            Document doc = null;
            try {
                File input = new File("storage/emulated/0/Download/aaa.html");
                doc = Jsoup.parse(input, "UTF-8", "");
            } catch (IOException e) {
                e.printStackTrace();
            }
            Element element = doc.getElementById("fstr");
            Log.d("fstr", element.text()); // this and other elements are null
            element = doc.getElementById("pvr");
            Log.d("pvr", element.text());
            element = doc.getElementById("nirat");
            Log.d("nirat", element.text());
            element = doc.getElementById("rnstr");
            Log.d("rnstr", element.text());
            element = doc.getElementById("dpml");
            Log.d("dpml", element.text());
            return null;
        }
    }

Возможно ли как-то это починить?

Answer 1

Проблема крылась в id элементов.

При сохранении из WebView - <span id="3D"fstr">3</span>

При сохранении через браузер на ПК - <span id="fstr"">3</span>

READ ALSO
Сделать &ldquo;Колесо&rdquo; или &ldquo;Барабан&rdquo;

Сделать “Колесо” или “Барабан”

Не знаю как правильно назвать) как можно сделать такую штуку (каждый столбик можно прокручивать отдельно колесом мыши или соотвпальцем) ? Похожая...

177
сращивание теней между двумя div

сращивание теней между двумя div

Есть макет, на фотографии его частьНе знаю как реализовать сращивание теней показанное на фото

203