2011-04-18 64 views
1

我知道我的問題有很多主題,但我找不到有用的解決方案,我的答案。我可以連接到網站並逐行閱讀Java,現在這是我的問題。我想從html頁面解析特定的信息。此頁面包括5天的天氣預報。例如預測標籤的日期是這樣的;我如何使用Java解析來自html源代碼的特定信息

//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> 
. 
. 
. 

根據這些標籤,我需要解析17年4月19日和8

+0

我忘了寫,我需要通過使用正則表達式:) – 2011-04-18 18:35:39

+0

http://download.oracle.com/javase/tutorial/essential/regex/index.html /class = \「arkaTrh \」>([0-9a- zA-Z] +)/ – Gerben 2011-04-18 18:41:42

+2

使用正則表達式解析HTML之前請仔細考慮。請參閱http://www.codinghorror.com/blog/2009/11/parsing-html-the-cthulhu-way.html – Feanor 2011-04-18 18:42:24

回答

0

您可以使用HtmlUnit。它是爲單元測試網頁而設計的,但您可以使用它來解析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()); 
+0

在您告訴您需要使用正則表達式之前,我編寫了我的答案。我認爲HtmlUnit比使用正則表達式更容易,但如果你需要它,所以我的答案不適合你。 – 2011-04-18 18:59:33

+0

我更喜歡HtmlCleaner :) – extraneon 2011-04-18 20:07:30

4

爲了愛上帝不要使用REGEX。我不知道有多少次必須在SO上重複。你會在一個痛苦的世界中結束。使用解析器,在Java中有可用的負載。下面是其中一些:

Jericho

Dom4j

htmlparser

但也有幾十個。只是谷歌「HTML解析器Java」或「Java DOM解析器」或東西。請。

+0

另外,不要逐行讀取文本。這是愚蠢的。 – 2011-04-18 20:59:53

+0

是的,我放棄了使用正則表達式解決我的問題,JSoup.Elements鏈接= doc.select(「th [id = ctl00_mpBody_thmGun」+ i +「]」); – 2011-04-20 07:08:30

相關問題