我需要從<title> </title>
標籤中提取網頁的標題。如何提取HTML標籤以獲取特定信息?
還需要顯示位於<body...>
和</body>
標籤之間的所有文本,但不包含在身體之外。
我不想要任何尖括號或任何返回的HTML數據。
我需要從<title> </title>
標籤中提取網頁的標題。如何提取HTML標籤以獲取特定信息?
還需要顯示位於<body...>
和</body>
標籤之間的所有文本,但不包含在身體之外。
我不想要任何尖括號或任何返回的HTML數據。
'標籤之間的所有文本,並且沒有任何東西在身體外面。」*因此,不像真正的網絡瀏覽器,它比那個更聰明。 – 2013-02-25 22:36:06
是的,我在本章的Streams中獲得了這個任務。所以我想他真的只是想確保我們知道如何操縱輸入流。它是HTML讓我感到困惑的是因爲在查看大量的HTML之後,它們看起來差異很大。 – art3m1sm00n 2013-02-25 22:37:39
檢查[JTidy庫](http://jtidy.sourceforge.net/)。它爲我節省了大量HTML解析時間。 – araknoid 2013-02-25 22:39:47
您可以使用類似:
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個索引之間的字符串。
有了這個,你可以啓動你的瀏覽器。
哦,so .indexOf返回文件中給定字符串的第一個字符的位置索引? – art3m1sm00n 2013-02-25 22:51:30
另外,你的'+ 6'只是一個任意數字或者是有價值的東西? – art3m1sm00n 2013-02-25 22:52:12
@GabrielleLee:這是''中的字符數,所以'substring'以開頭標記後面的第一個字符*開始。 – 2013-02-25 22:53:11
根據您的描述,您不需要解析完整的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;
}
我是一個非常全新的程序員,我不知道「有限狀態機」是什麼。加上我的指示詳細信息,我應該閱讀整個HTML,然後搜索並切斷它。 – art3m1sm00n 2013-02-25 22:41:48
基本上,FSM意味着您開始分析某個「狀態」中的字符串,並根據您的輸入切換狀態。在這種情況下,一個狀態是「數據」,另一個狀態是「標記」。如果您正在讀取* data *,則附加讀取的字符。如果您正在閱讀*標籤*,則可以驗證它是否是關閉主體。 我寫了一個從流中讀取的例子。你也可以把字符串保存到一個'String'中,在'for'循環中用'charAt'掃描字符串。 – Javier 2013-02-25 22:57:29
有兩個發展階段的程序員用它來解決這些各種各樣的問題:
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?
*「在HTML(良好的HTML)中,所有的標籤都跟着結束標籤......」*你的意思是像'
'和''? –
2013-02-25 22:40:56
點作出。原文句子不正確,但其餘部分仍然正常。我現在要編輯:) – christopher 2013-02-25 22:42:08
好吧,所以我想我得到你在說什麼。讓我試着重新修改它,看看我是否得到它: – art3m1sm00n 2013-02-25 22:44:27
爲了簡化我的問題,我怎麼通過一個巨大的字符串搜索找到另一個字符串,並記錄其位置?
int index = bigString.indexOf("<body");
...發現的<body
第一次出現在bigString
並返回其索引(你可以用substring
使用)。但是如果你不確定如何做到這一點,那麼這項任務就很困難。該課程應該已經爲你完成這項任務做好了準備,而且看起來好像沒有。
解析HTML是複雜。您可以使用indexOf
和substring
來完成一個半完成,不正確的工作,但它會......半完成且不正確。
感謝這真的清除了事情。 – art3m1sm00n 2013-02-25 22:59:52
有很多方法可以解決這個問題,但是使用您提供的約束條件可以採取低級別的方法。首先假設你已經將這整個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);
如果你的課程in是合理的結構,那麼你應該h爲解決這個問題提供了基本的工具。如果不是,那麼所有對導師的尊重,這是各種堅果。首先,*「顯示位於'