使用 Jsoup 将 table 从 link 解析为字符串
Parsing a table to a String from a link with Jsoup
就像标题中所说的那样,我想将 table 解析为字符串或字符串数组,这样,干净的文本来自当地公交运营商的网站。该网站有一个 table 出现在页面中间,其中包含下一小时该站点的公交车时间。
我已经有一段时间没有使用 Jsoup 了,但我终其一生都无法弄清楚为什么我拥有的东西不起作用。我尝试了从我在这里找到的类似问题的答案中提出的两个建议,但都没有用,而且我担心 table 的元素实际上是空的,因为它从来没有 returns 任何东西...
我从中提取数据的网站如下:http://www.stcp.pt/pt/viajar/horarios/?paragem=AAL2&t=smsbus
(如果这没有显示任何 table 那是因为这个站点只在夜间,所以请尝试这个例如:http://www.stcp.pt/pt/viajar/horarios/?paragem=HB1&t=smsbus 应该在白天工作)
我的代码:
import java.io.IOException;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
public class STCPreaderMain {
public static void main(String[] args) throws IOException {
String ParagemID = "AAL2"; // HB1, AAL2 for night
String getUrl = "http://www.stcp.pt/pt/viajar/horarios/?paragem=REPLACE&t=smsbus";
getUrl = getUrl.replace("REPLACE", ParagemID);
String text = "";
System.out.println(getUrl);
Document doc = Jsoup.connect(getUrl).get();
Elements tableElements = doc.select("table#smsBusResults");
System.out.println(tableElements.text());
Elements tableHeaderEles = tableElements.select("thead tr th");
System.out.println("headers");
for (int i = 0; i < tableHeaderEles.size(); i++) {
System.out.println(tableHeaderEles.get(i).text());
}
System.out.println();
Elements tableRowElements = tableElements.select(":not(thead) tr");
for (int i = 0; i < tableRowElements.size(); i++) {
Element row = tableRowElements.get(i);
System.out.println("row");
Elements rowItems = row.select("td");
for (int j = 0; j < rowItems.size(); j++) {
System.out.println(rowItems.get(j).text());
}
System.out.println();
}
}
}
(抱歉,如果代码格式不正确,有时 eclipse 的自动格式化程序会出现问题,而且我从来都不擅长格式化 :( )
基本上我的问题是我可以找到声明 table 名称为 smsBusResults 的行,但是当我实际去使用 table#smsBusResults 搜索它时,我似乎什么也没找到。 .
您找不到 table,因为它不在您发布的 URL 中...
当您转到 URL 时,浏览器正在下载其他 URL,其中之一是 http://www.stcp.pt/pt/itinerarium/soapclient.php?codigo=AAL2&linha=0,其中包含您的 table.
打开浏览器的 Developer Tools
(按 F12)并观察网络流量 - 您会看到有几个 GET
请求,其中一个包含 table.
就像标题中所说的那样,我想将 table 解析为字符串或字符串数组,这样,干净的文本来自当地公交运营商的网站。该网站有一个 table 出现在页面中间,其中包含下一小时该站点的公交车时间。
我已经有一段时间没有使用 Jsoup 了,但我终其一生都无法弄清楚为什么我拥有的东西不起作用。我尝试了从我在这里找到的类似问题的答案中提出的两个建议,但都没有用,而且我担心 table 的元素实际上是空的,因为它从来没有 returns 任何东西...
我从中提取数据的网站如下:http://www.stcp.pt/pt/viajar/horarios/?paragem=AAL2&t=smsbus (如果这没有显示任何 table 那是因为这个站点只在夜间,所以请尝试这个例如:http://www.stcp.pt/pt/viajar/horarios/?paragem=HB1&t=smsbus 应该在白天工作)
我的代码:
import java.io.IOException;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
public class STCPreaderMain {
public static void main(String[] args) throws IOException {
String ParagemID = "AAL2"; // HB1, AAL2 for night
String getUrl = "http://www.stcp.pt/pt/viajar/horarios/?paragem=REPLACE&t=smsbus";
getUrl = getUrl.replace("REPLACE", ParagemID);
String text = "";
System.out.println(getUrl);
Document doc = Jsoup.connect(getUrl).get();
Elements tableElements = doc.select("table#smsBusResults");
System.out.println(tableElements.text());
Elements tableHeaderEles = tableElements.select("thead tr th");
System.out.println("headers");
for (int i = 0; i < tableHeaderEles.size(); i++) {
System.out.println(tableHeaderEles.get(i).text());
}
System.out.println();
Elements tableRowElements = tableElements.select(":not(thead) tr");
for (int i = 0; i < tableRowElements.size(); i++) {
Element row = tableRowElements.get(i);
System.out.println("row");
Elements rowItems = row.select("td");
for (int j = 0; j < rowItems.size(); j++) {
System.out.println(rowItems.get(j).text());
}
System.out.println();
}
}
}
(抱歉,如果代码格式不正确,有时 eclipse 的自动格式化程序会出现问题,而且我从来都不擅长格式化 :( )
基本上我的问题是我可以找到声明 table 名称为 smsBusResults 的行,但是当我实际去使用 table#smsBusResults 搜索它时,我似乎什么也没找到。 .
您找不到 table,因为它不在您发布的 URL 中...
当您转到 URL 时,浏览器正在下载其他 URL,其中之一是 http://www.stcp.pt/pt/itinerarium/soapclient.php?codigo=AAL2&linha=0,其中包含您的 table.
打开浏览器的 Developer Tools
(按 F12)并观察网络流量 - 您会看到有几个 GET
请求,其中一个包含 table.