2013-02-25 84 views
0

我需要從<title> </title>標籤中提取網頁的標題。如何提取HTML標籤以獲取特定信息?

還需要顯示位於<body...></body>標籤之間的所有文本,但不包含在身體之外。

我不想要任何尖括號或任何返回的HTML數據。

+1

如果你的課程in是合理的結構,那麼你應該h爲解決這個問題提供了基本的工具。如果不是,那麼所有對導師的尊重,這是各種堅果。首先,*「顯示位於''和''標籤之間的所有文本,並且沒有任何東西在身體外面。」*因此,不像真正的網絡瀏覽器,它比那個更聰明。 – 2013-02-25 22:36:06

+0

是的,我在本章的Streams中獲得了這個任務。所以我想他真的只是想確保我們知道如何操縱輸入流。它是HTML讓我感到困惑的是因爲在查看大量的HTML之後,它們看起來差異很大。 – art3m1sm00n 2013-02-25 22:37:39

+0

檢查[JTidy庫](http://jtidy.sourceforge.net/)。它爲我節省了大量HTML解析時間。 – araknoid 2013-02-25 22:39:47

回答

6

您可以使用類似:

String html = "<html>My page</html>"; 
String title = html.substring(html.indexOf("<html>") + 6, html.indexOf("</html")); 
System.out.println(title); 

String.indexOf(string)方法返回一個字符串的開始索引(在本例中,"<html>""</html>")給定的字符串(變量HTML)。

String.substring(int, int)方法返回2個索引之間的字符串。

有了這個,你可以啓動你的瀏覽器。

+0

哦,so .indexOf返回文件中給定字符串的第一個字符的位置索引? – art3m1sm00n 2013-02-25 22:51:30

+0

另外,你的'+ 6'只是一個任意數字或者是有價值的東西? – art3m1sm00n 2013-02-25 22:52:12

+0

@GabrielleLee:這是''中的字符數,所以'substring'以開頭標記後面的第一個字符*開始。 – 2013-02-25 22:53:11

0

根據您的描述,您不需要解析完整的HTML文檔,只需從中提取一些信息。基於Finite State Machine的方法將可行。

掃描直到找到<title>元素。從這一點來說,任何東西都是數據,直到你找到一個關閉</title>。然後掃描,直到找到開頭<body>。從這一點來說,你需要閱讀「內容」跳過任何是<>之間,可以進行如下:

//input stream in is just after <body> 
String body=""; 
String element=""; 
boolean ignore=false 
while (true) { 
    char c = in.read(); 
    if (c<0) break; //end of stream 
    if (ignore) { 
    if (c=='>') { 
     if (element.equals("/body")) break; //closing </body> 
     ignore=false; 
    } 
    else element+=c; 
    } else { 
    //not in ignore mode 
    if (c=='<') {element=""; ignore=true;} 
    else body+=c; 
    } 
+0

我是一個非常全新的程序員,我不知道「有限狀態機」是什麼。加上我的指示詳細信息,我應該閱讀整個HTML,然後搜索並切斷它。 – art3m1sm00n 2013-02-25 22:41:48

+0

基本上,FSM意味着您開始分析某個「狀態」中的字符串,並根據您的輸入切換狀態。在這種情況下,一個狀態是「數據」,另一個狀態是「標記」。如果您正在讀取* data *,則附加讀取的字符。如果您正在閱讀*標籤*,則可以驗證它是否是關閉主體。 我寫了一個從流中讀取的例子。你也可以把字符串保存到一個'String'中,在'for'循環中用'charAt'掃描字符串。 – Javier 2013-02-25 22:57:29

0

有兩個發展階段的程序員用它來解決這些各種各樣的問題:

1.分析出自己的數據:

在HTML(HTML好)最標籤後閉標籤。 A <title>標籤就是其中之一。如果您正在嘗試查找它們之間的內容,請查找<title>的索引。您可能需要最後的>的索引,以方便使用。

然後當前字符不是<時,將該字符添加到字符串。

當你點擊<時,你應該檢查它是否是</title>。如果不是,請繼續閱讀。基本上你保持循環。每次您點擊<時,請檢查它是否爲結束標題標記。

當你意識到這是超硬並重新發明輪子,提前步驟2:

2.使用DOM解析器庫。

當你傷害自己試圖做第1步之後,你會發現爲什麼程序員強烈建議你永遠不要解析HTML或在HTML上使用正則表達式。實現戰役已經打了,並與battletested HTML解析器榮獲:What are the pros and cons of the leading Java HTML parsers?

+1

*「在HTML(良好的HTML)中,所有的標籤都跟着結束標籤......」*你的意思是像'
'和''? – 2013-02-25 22:40:56

+0

點作出。原文句子不正確,但其餘部分仍然正常。我現在要編輯:) – christopher 2013-02-25 22:42:08

+0

好吧,所以我想我得到你在說什麼。讓我試着重新修改它,看看我是否得到它: – art3m1sm00n 2013-02-25 22:44:27

1

爲了簡化我的問題,我怎麼通過一個巨大的字符串搜索找到另一個字符串,並記錄其位置?

String#indexOf(String)例如:

int index = bigString.indexOf("<body"); 

...發現的<body第一次出現在bigString並返回其索引(你可以用substring使用)。但是如果你不確定如何做到這一點,那麼這項任務就很困難。該課程應該已經爲你完成這項任務做好了準備,而且看起來好像沒有。

解析HTML是複雜。您可以使用indexOfsubstring來完成一個半完成,不正確的工作,但它會......半完成且不正確。

+0

感謝這真的清除了事情。 – art3m1sm00n 2013-02-25 22:59:52

0

有很多方法可以解決這個問題,但是使用您提供的約束條件可以採取低級別的方法。首先假設你已經將這整個HTML文檔接收到一個名爲html的字符串中。第一項任務是搜索「'。有很多錯誤檢查,這個答案不會涵蓋,但是我們不能爲你做所有的功課:P,所以我們將假設title元素是小寫字體和格式:

第一個我們需要determin其中的HTML是title元素(在這裏我使用indexOf()

int start = html.indexOf("<title>")+"<title>".length(); 
int end = html.indexOf("</title>", start); 

然後將其解壓縮到一個字符串(使用substring()):

String title = html.substring(start, end);