gpt4 book ai didi

java - JSoup 解析 HTML

转载 作者:行者123 更新时间:2023-12-01 17:34:32 26 4
gpt4 key购买 nike

我正在尝试解析一个格式不正确的 DTD html 文件,我使用 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>

编辑:我正在强制关闭,我需要 AsyncTask 中的 JSoup。这是 LOgcat:

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());
}
}
}

最佳答案

所以,你有一个 InputStream而不是网址?然后您应该使用 Jsoup#parse() 方法需要 InputStream :

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

charsetName应该是文档最初编码的字符集。您可以保留它 null让 Jsoup 决定还是回退到 UTF-8。 baseUri应该是最初提供 HTML 的 URL。可以留下null ,您将无法解析相对链接。

但是如果您确实有原始 URL,那么您也可以只使用 Jsoup#connect() :

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

无论您通过何种方式获得 Document ,您可以使用CSS selectors选择文档中感兴趣的元素。另请参阅Jsoup cookbook on that subject 。这是一个从<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

关于java - JSoup 解析 HTML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7830972/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com