JSoup анализирует HTML

Я пытаюсь проанализировать неправильно сформированный html-файл DTD, который я получаю с помощью входного потока с помощью JSOUP, и получить все данные в полях TD. Как я могу сделать это с JSoup? Я уже просмотрел http://jsoup.org/cookbook/, но мне нужен пример, чтобы получить его начал.

Заранее спасибо.

Я уже пробовал saxparser, но не могу заставить работать DTD.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-             strict.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="nl" lang="nl"> 
<TABLE class=personaltable cellSpacing=0 cellPadding=0> 
 <TBODY> 
  <TR class=alternativerow> 
   <TD>Nieuw beltegoed:</TD> 
   <TD>€ 1,00</TD></TR> 
  <TR> 
   <TD>Tegoed vorige periode:  
   <TD>€ 2,00</TD></TD></TR> 
  <TR class=alternativerow> 
   <TD>Tegoed tot 09-11-2011:  
   <TD>€ 10,00</TD></TD></TR> 
  <TR> 
   <TD> 
   <TD height=25></TD> 
  <TR class=alternativerow> 
   <TD>Verbruik sinds nieuw tegoed:</TD> 
   <TD>€ 0,33</TD></TR> 
  <TR> 
   <TD>Ongebruikt tegoed:</TD> 
   <TD>€ 12,00</TD></TR> 
  <TR class=alternativerow> 
   <TD class=f-Orange>Verbruik boven bundel:</TD> 
   <TD class=f-Orange>€ 0,00</TD></TR> 
  <TR> 
   <TD>Verbruik dat niet in de bundel zit*:</TD> 
   <TD>€ 0,00</TD></TR> 
  </TBODY> 
 </TABLE> 
</html> 

Изменить: я приближаюсь к силе, мне нужен JSoup в моей AsyncTask. Вот логкат:

10-20 21:07:36.679: ERROR/AndroidRuntime(1396): FATAL EXCEPTION: main
10-20 21:07:36.679: ERROR/AndroidRuntime(1396): java.lang.NullPointerException
10-20 21:07:36.679: ERROR/AndroidRuntime(1396):     at   com.sencide.AndroidLogin$MyTask.onPostExecute(AndroidLogin.java:276)
10-20 21:07:36.679: ERROR/AndroidRuntime(1396):     at com.sencide.AndroidLogin$MyTask.onPostExecute(AndroidLogin.java:1)
10-20 21:07:36.679: ERROR/AndroidRuntime(1396):     at android.os.AsyncTask.finish(AsyncTask.java:417)
10-20 21:07:36.679: ERROR/AndroidRuntime(1396):     at android.os.AsyncTask.access$300(AsyncTask.java:127)
10-20 21:07:36.679: ERROR/AndroidRuntime(1396):     at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:429)
10-20 21:07:36.679: ERROR/AndroidRuntime(1396):     at android.os.Handler.dispatchMessage(Handler.java:99)
10-20 21:07:36.679: ERROR/AndroidRuntime(1396):     at android.os.Looper.loop(Looper.java:130)
10-20 21:07:36.679: ERROR/AndroidRuntime(1396):     at android.app.ActivityThread.main(ActivityThread.java:3835)
10-20 21:07:36.679: ERROR/AndroidRuntime(1396):     at java.lang.reflect.Method.invokeNative(Native Method)
10-20 21:07:36.679: ERROR/AndroidRuntime(1396):     at java.lang.reflect.Method.invoke(Method.java:507)
10-20 21:07:36.679: ERROR/AndroidRuntime(1396):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:847)
10-20 21:07:36.679: ERROR/AndroidRuntime(1396):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:605)
10-20 21:07:36.679: ERROR/AndroidRuntime(1396):     at dalvik.system.NativeStart.main(Native Method)

Вот код AsyncTask:

public class MyTask extends AsyncTask<String, Integer, String> {
    private Elements tdsFromSecondColumn=null;
}

protected String doInBackground(String... params) {
      InputStream inputStreamActivity = response.getEntity().getContent();

                BufferedReader reader = new BufferedReader(new InputStreamReader(inputStreamActivity));
                StringBuilder sb = new StringBuilder();
                String line = null;

                while ((line = reader.readLine()) != null) {
                    sb.append(line + "\n");
                }

                /******* CLOSE CONNECTION AND STREAM *******/

                System.out.println(sb);
                inputStreamActivity.close();

                String kpn;
                kpn = sb.toString();

                Document doc = Jsoup.parse(kpn);
                Elements tdsFromSecondColumn = doc.select("table.personaltable td:eq(1)");
}

@Override 
    protected void onPostExecute(String result) { 
        //publishProgress(false); 
        TextView tv = (TextView)findViewById(R.id.lbl_top);

        for (Element tdFromSecondColumn : tdsFromSecondColumn) { 
            //System.out.println(tdFromSecondColumn.text()); 
            tv.setText("");
            tv.setText(tdFromSecondColumn.text());
        }
}
}

person Lars    schedule 20.10.2011    source источник


Ответы (1)


Итак, у вас есть InputStream, а не URL? Затем вы должны использовать Jsoup#parse(), который принимает InputStream:

Document document = Jsoup.parse(inputStream, charsetName, baseUri);
// ...

charsetName должен быть набором символов, в котором изначально закодирован документ. Вы можете оставить его null, чтобы позволить Jsoup принять решение или вернуться к UTF-8. baseUri должен быть URL-адресом, с которого исходно обслуживался HTML. Можно оставить null, только относительные ссылки разрешать не получится.

Но если у вас действительно есть исходный URL-адрес, вы также можете просто использовать Jsoup#connect():

Document document = Jsoup.connect(url).get();
// ...

Независимо от того, как вы получили Document, вы можете использовать селекторы CSS для выбора элементов. интерес к документу. См. также поваренную книгу Jsoup по этому вопросу. Вот пример, который извлекает все данные из 2-го столбца <table> с именем класса personaltable:

Elements tdsFromSecondColumn = document.select("table.personaltable td:eq(1)");

for (Element tdFromSecondColumn : tdsFromSecondColumn) {
    System.out.println(tdFromSecondColumn.text());
}

что приводит к:

€ 1,00
€ 2,00
€ 10,00

€ 0,33
€ 12,00
€ 0,00
€ 0,00
person BalusC    schedule 20.10.2011
comment
Привет BalusC, Большое спасибо за ваш ответ, я попробую сразу, когда вернусь с работы. У меня есть еще вопросы, есть ли способ найти строку типа Nieuw в элементах TD, а затем сделать что-то вроде tv.setText (Nieuw beltegoed: + tdFromSecondColumn.text()); заранее спасибо - person Lars; 20.10.2011
comment
Вы можете использовать псевдоселектор :contains(): document.select("table.personaltable td:contains('Nieuw')"). См. также кулинарную книгу Jsoup по этому вопросу: jsoup.org/cookbook/extracting-data/selector -синтаксис. - person BalusC; 20.10.2011
comment
Привет, BalusC, Thx работает нормально, но у меня есть JSoup в AsyncTask, я приближаюсь к силе. Я отредактировал свой код с помощью кода Logcat и AsyncTask. У вас есть время помочь? Спасибо заранее. - person Lars; 20.10.2011
comment
Это дает исключение во время выполнения, когда я оставляю baseUri равным нулю. - person The_Cute_Hedgehog; 06.03.2019
comment
Документация здесь jsoup.org/cookbook/input/load-document-from-file говорит, что его можно оставить как пустую строку, а не нуль. - person The_Cute_Hedgehog; 06.03.2019