从天气网站抓取完整 html 数据
Scrape full html data from weather website
我正在尝试从该网站获取天气数据:
https://www.ilmeteo.it/meteo/Magenta/previsioni-orarie?refresh_ce
使用代码:
try {
int i = 0;
if (googlefirst3.startsWith("http")) {
Document document = Jsoup.connect("https://www.ilmeteo.it/meteo/Magenta/previsioni-orarie?refresh_ce").userAgent("Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11 Firefox/19.0").timeout(0).get();
Elements temp = document.select("tr");
String verifica;
verifica=document.html();
for (Element movielist : temp) {
i++;
html = (i + "|||" + movielist.getElementsByTag("td").first().html());
array3b[i] = html;
}
}
} catch (IOException e) {
e.printStackTrace();}
我正在尝试获取包含温度、风和时间数据的 table 行:
但是我无法得到它。我得到的文件不包含这些数据,而且似乎不完整。
我以为这是由于 javascript 生成的 html,但即使使用这种方法:
How do I get the web page contents from a WebView?
我无法得到它。我不确定 javascript 是问题所在。
任何人都可以帮助我至少尝试确定问题的性质吗?
非常感谢。
您尝试解析的页面包含使用 iframe
数据的内容。
<iframe name="frmprevi" id="frmprevi"
src="https://www.ilmeteo.it/portale/meteo/previsioni1.php?citta=Magenta&c=3749&gm=25"
width="660" height="600" marginheight="0" marginwidth="0" scrolling="no"
frameborder="0" style="margin:0px;padding:0px"></iframe>
这就是 Jsoup 无法访问它的原因。要获取您想要的数据,只需直接解析来自 iframe src 的 URL:
https://www.ilmeteo.it/portale/meteo/previsioni1.php?citta=Magenta&c=3749&gm=25
现在应该很容易了,但请注意 URL 中的参数 gm=25
可能代表一个月的第 25 天,因此您必须相应地更改它以获得不同的数据天.
深入挖掘后发现了一个 iFrame
你可以试试这个
Thread(Runnable {
val document: Document =
Jsoup.connect("https://www.ilmeteo.it/meteo/Magenta/previsioni-orarie?refresh_ce")
.userAgent("Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11 Firefox/19.0")
.timeout(2000).get()
val body = document.body()
val table = body.getElementsByClass("datatable")
val iframe: Element = body.getElementById("frmprevi")
val iframeSrc: String = iframe.attr("src")
if (iframeSrc != null) {
val iframeContentDoc = Jsoup.connect(iframeSrc).get()
val temps = iframeContentDoc.body().getElementsByClass("boldval")
for(temp in temps)
{
Log.d("temps",temp.text())
}
}
}).start()
它在 kotlin 中,但我想您会理解如何将其翻译成 java 以及如何从那里获取其他信息。
我正在尝试从该网站获取天气数据:
https://www.ilmeteo.it/meteo/Magenta/previsioni-orarie?refresh_ce
使用代码:
try {
int i = 0;
if (googlefirst3.startsWith("http")) {
Document document = Jsoup.connect("https://www.ilmeteo.it/meteo/Magenta/previsioni-orarie?refresh_ce").userAgent("Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11 Firefox/19.0").timeout(0).get();
Elements temp = document.select("tr");
String verifica;
verifica=document.html();
for (Element movielist : temp) {
i++;
html = (i + "|||" + movielist.getElementsByTag("td").first().html());
array3b[i] = html;
}
}
} catch (IOException e) {
e.printStackTrace();}
我正在尝试获取包含温度、风和时间数据的 table 行:
但是我无法得到它。我得到的文件不包含这些数据,而且似乎不完整。 我以为这是由于 javascript 生成的 html,但即使使用这种方法:
How do I get the web page contents from a WebView?
我无法得到它。我不确定 javascript 是问题所在。 任何人都可以帮助我至少尝试确定问题的性质吗?
非常感谢。
您尝试解析的页面包含使用 iframe
数据的内容。
<iframe name="frmprevi" id="frmprevi"
src="https://www.ilmeteo.it/portale/meteo/previsioni1.php?citta=Magenta&c=3749&gm=25"
width="660" height="600" marginheight="0" marginwidth="0" scrolling="no"
frameborder="0" style="margin:0px;padding:0px"></iframe>
这就是 Jsoup 无法访问它的原因。要获取您想要的数据,只需直接解析来自 iframe src 的 URL: https://www.ilmeteo.it/portale/meteo/previsioni1.php?citta=Magenta&c=3749&gm=25
现在应该很容易了,但请注意 URL 中的参数 gm=25
可能代表一个月的第 25 天,因此您必须相应地更改它以获得不同的数据天.
深入挖掘后发现了一个 iFrame
你可以试试这个
Thread(Runnable {
val document: Document =
Jsoup.connect("https://www.ilmeteo.it/meteo/Magenta/previsioni-orarie?refresh_ce")
.userAgent("Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11 Firefox/19.0")
.timeout(2000).get()
val body = document.body()
val table = body.getElementsByClass("datatable")
val iframe: Element = body.getElementById("frmprevi")
val iframeSrc: String = iframe.attr("src")
if (iframeSrc != null) {
val iframeContentDoc = Jsoup.connect(iframeSrc).get()
val temps = iframeContentDoc.body().getElementsByClass("boldval")
for(temp in temps)
{
Log.d("temps",temp.text())
}
}
}).start()
它在 kotlin 中,但我想您会理解如何将其翻译成 java 以及如何从那里获取其他信息。