如何使用Java解析html源代码中的特定信息

如何使用Java解析html源代码中的特定信息,java,html,regex,parsing,web-scraping,Java,Html,Regex,Parsing,Web Scraping,我知道我的问题有很多主题,但我找不到有用的答案。我可以连接到网站,用Java逐行阅读,现在我的问题来了。我想解析html页面中的特定信息。本页包括5天天气预报。例如,forecast标签的日期如下所示 //date of forecast < th id="ctl00_mpBody_thmGun1" class="arkaTrh">19 April< /th > //Min weather: < td id="ctl00_mpBody_thmMin1" class

我知道我的问题有很多主题,但我找不到有用的答案。我可以连接到网站,用Java逐行阅读,现在我的问题来了。我想解析html页面中的特定信息。本页包括5天天气预报。例如,forecast标签的日期如下所示

//date of forecast
< th id="ctl00_mpBody_thmGun1" class="arkaTrh">19 April< /th >

//Min weather:
< td id="ctl00_mpBody_thmMin1" class="minS">8< /td>

//Max weather
 < td id="ctl00_mpBody_thmMax1" class="maxS">17< /td>

second day and others tags continue like this,
< th id="ctl00_mpBody_thmGun2" class="arkaTrh">20 April< /th >
.
.
.
//预测日期
4月19日
//最低天气:
8
//最大天气
17
第二天和其他的标签继续这样,
4月20日
.
.
.
根据这些标签,我需要解析4月19日、17日和8日

您可以使用。它是为单元测试网页而设计的,但您可以使用它来解析HTML代码。您可以使用以下方式获取预测数据:

final WebClient webClient = new WebClient();
final HtmlPage page = webClient.getPage("http://url.to.your.data");

//get temperatures
HtmlTableDataCell minTemp = page.getByXPath("//td[@class='minS']").get(0);
HtmlTableDataCell maxTemp = page.getByXPath("//td[@class='maxS']").get(0);
HtmlTableHeaderCell date = page.getByXPath("//th[@class='arkaTrh']").get(0);

System.out.println("Forecast for " + date.asText() + " - Min: " + minTemp.asText() + ", Max: " + maxTemp.asText()); 
id="ctl00_mpBody_thmGun1"[^>]*?>(.*?)<
你可以用。它是为单元测试网页而设计的,但您可以使用它来解析HTML代码。您可以使用以下方式获取预测数据:

final WebClient webClient = new WebClient();
final HtmlPage page = webClient.getPage("http://url.to.your.data");

//get temperatures
HtmlTableDataCell minTemp = page.getByXPath("//td[@class='minS']").get(0);
HtmlTableDataCell maxTemp = page.getByXPath("//td[@class='maxS']").get(0);
HtmlTableHeaderCell date = page.getByXPath("//th[@class='arkaTrh']").get(0);

System.out.println("Forecast for " + date.asText() + " - Min: " + minTemp.asText() + ", Max: " + maxTemp.asText()); 
id="ctl00_mpBody_thmGun1"[^>]*?>(.*?)<

看在上帝的份上,不要使用正则表达式。我不知道这要重复多少次。你最终会陷入痛苦的世界。使用解析器,java中有可用的加载。以下是其中一些:


但还有几十个。只要谷歌“html解析器java”或“java dom解析器”之类的东西。请。

看在上帝的份上,不要使用正则表达式。我不知道这要重复多少次。你最终会陷入痛苦的世界。使用解析器,java中有可用的加载。以下是其中一些:


但还有几十个。只要谷歌“html解析器java”或“java dom解析器”之类的东西。请。

您可以像这样制作一些正则表达式:

final WebClient webClient = new WebClient();
final HtmlPage page = webClient.getPage("http://url.to.your.data");

//get temperatures
HtmlTableDataCell minTemp = page.getByXPath("//td[@class='minS']").get(0);
HtmlTableDataCell maxTemp = page.getByXPath("//td[@class='maxS']").get(0);
HtmlTableHeaderCell date = page.getByXPath("//th[@class='arkaTrh']").get(0);

System.out.println("Forecast for " + date.asText() + " - Min: " + minTemp.asText() + ", Max: " + maxTemp.asText()); 
id="ctl00_mpBody_thmGun1"[^>]*?>(.*?)<
id=“ctl00\u mpBody\u thmGun1”[^>]*?>(*?)<
但是如果您想要一个更健壮的解决方案,最好清理HTML并使用XPath选择数据:

您可以像这样创建一些正则表达式:

final WebClient webClient = new WebClient();
final HtmlPage page = webClient.getPage("http://url.to.your.data");

//get temperatures
HtmlTableDataCell minTemp = page.getByXPath("//td[@class='minS']").get(0);
HtmlTableDataCell maxTemp = page.getByXPath("//td[@class='maxS']").get(0);
HtmlTableHeaderCell date = page.getByXPath("//th[@class='arkaTrh']").get(0);

System.out.println("Forecast for " + date.asText() + " - Min: " + minTemp.asText() + ", Max: " + maxTemp.asText()); 
id="ctl00_mpBody_thmGun1"[^>]*?>(.*?)<
id=“ctl00\u mpBody\u thmGun1”[^>]*?>(*?)<
但是如果您想要一个更健壮的解决方案,最好清理HTML并使用XPath选择数据:

我忘了写,我需要使用正则表达式:)/class=\“arkathh\”>([0-9a-zA-Z]+)/在使用正则表达式解析HTML之前仔细考虑。看,我忘记写了,我需要使用正则表达式:)/class=\'arkathh\“>([0-9a-zA-Z]+)/在使用正则表达式解析HTML之前仔细考虑。在你告诉我需要使用regexp之前,我写下了我的答案。我认为这比使用regexp容易得多,但如果你需要它,我的答案不适合你。在你告诉你需要使用regexp之前,我写了我的答案。我认为HtmlUnit比使用regexp简单得多,但如果你需要它,我的答案就不适合你了。是的,我放弃了使用regex,只是用JSoup.Elements link=doc.select(“th[id=ctl00\u mpBody\u thmGun”+I+“]”解决了我的问题;是的,我放弃了使用正则表达式,只是用JSoup.Elements link=doc.select(“th[id=ctl00\u mpBody\u thmGun”+I+”)解决了我的问题;