2012-10-13 63 views
1

我非常喜歡Java新手。對於我的課程,我們必須打印出所有要從用戶輸入的html源代碼中解析的鏈接。如何從使用Java的html解析鏈接?

基本上,我想弄清楚如何獲取href屬性之後的鏈接字符串,併爲網頁上的所有鏈接執行此操作,而無需使用外部方法(即使用數組,字符串和字符串方法但不能導入其他庫)。

+0

正確的方法:正確的HTML解析器。對於你的班級:我只是簡單地假設正則表達式。 – LanguagesNamedAfterCofee

+0

你見過[this](http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454)?不是我想糾正你,它只是一個偉大的職位:) – linski

+0

它可以在jsoup的幫助下完成。更多信息可以在http://www.mkyong.com/java/jsoup-html例子中找到。 -parser-hello-world-examples/ – jafarmlp

回答

5

不要使用Parser或RegExp。嘗試Jerry。像(未測試):

Jerry doc = jerry(html); 
doc.$("a").each(new JerryFunction() { 
    public boolean onNode(Jerry $this, int index) { 
     String href = $this.attr("href"); 
     System.out.println(href); 
    } 
} 

或任何HTML友好的查詢語言。由於非的外部需求嘗試Trying to parse links in an HTML directory listing using Java

+0

謝謝,但有沒有辦法做到這一點,只是使用字符串的子串,數組和方法?大概應該在我原來的帖子中澄清。 – user1743740

+0

@AntonBessonov,問題是爲java不是js :) – Chirlo

+1

是的,你可以。但它很容易出錯,維護起來很糟糕,而且你寫的更多的是7行以上。爲什麼你會用子字符串或類似的方式做到這一點?見http://stackoverflow.com/questions/590747/using-regular-expressions-to-parse-html-why-not和http://stackoverflow.com/questions/1732348/regex-match-open-tags-except -xhtml-self-contained-tags/1732454#1732454和http://www.codinghorror.com/blog/2009/11/parsing-html-the-cthulhu-way.html –

2

我不知道你是什麼類的,因此正則表達式的解決方案可能對你太先進。
可能例如,如果你是第一年的例子,但我真的不知道。

你可以使用子字符串或數組來做到這一點,但是這樣做太多了。這就是爲什麼standard Java regular expressions存在:

String A_TAG_MATCHING_GROUP = "<a>([^<>]*)</a>"; 

Matcher matcher = Pattern.compile(A_TAG_MATCHING_GROUP).matcher("<html>\n<head>d\nadas</head><body><a>LINK_DESC_ONE</a>dsdasd<a>LINK_DESC_2</a></body></html>"); 
String url, linkDescription; 
while (matcher.find()) { 
     System.out.println(matcher.group(1)); 
} 

編譯並運行此代碼,然後繼續閱讀!

關鍵部分是A_TAG_MATCHING_GROUP正則表達式。因爲它是現在,它會匹配一個確切的字符串「<一個>」依次爲:

  • 沒有或你想要的characther的(由星級所表示 - *)
  • characther如上所述被定義爲是不(由插入記號所表示 - ^)任何字符「<」或「>」(當某事是內部方括號確切術語 - []是字符類

所以,如果你寫的A_TAG_MATCHING_GROUP正則表達式良好,

matcher.group(i); 

你會得到的URL。因爲它是爲你的課程而編寫的,所以我不會爲你編寫它:) 修改matcher參數並播放一下(改變硬編碼的html字符串)。獲取一些真實的html,並將你的輸出與真實工具的輸出進行比較,如one

當然,你必須閱讀給定的教程之前(this可能也有用),這裏是相關的API鏈接:

但是,如果你想使用「數組和字符串」,您可以使用以下algorithmn:

  1. 讀取每個字符例如在HTML字符

    String html; 爲(字符c:s.toCharArray()){//
    }

  2. 當你到了 「<」 remeber它(例如,在布爾變量first_char_of_a_tag_found)

  3. 決定將你immediatley希望它後面跟着「a」字符,否則你將允許換行符和空格。當你檢測到「a」時,記住它是一個布爾變量。

  4. 當你到達「href =」「開始記住內容 - 可能使用[substring()](http://docs.oracle.com/javase/6/docs/api/java/lang/String的.html#子(INT,INT))有關於HTML字符串,並將其返回值存儲在StringBuilder變量稱爲URL。

這是一個非常低級的算法,但它會做的工作。這需要大量的編碼,它是一個monolithic,procedural的方法。

基本上,loosley說你會實現一個正則表達式「引擎」 - 上我在這篇文章的第一部分描述了這一點。

我將它們都編程爲作業(第一次用Java進行求職面試,第二次用C作爲Java大學入學考試),但儘管採用了通常的學習方法(第二次)首先推薦第一個 - 但這取決於你是否在緊張的時間表,以及你目前的知識。

希望它能幫助:)

編輯:

無法解析HTML正則表達式,但你可以一個標籤他們分析出的URL。不過,儘管如此,我仍然可以像安東建議的那樣與傑瑞一起去。

你可以看到,像傑裏解決方案是從單純的觀察來處理它需要他的大小和礦柱和時間,對於初學者在現實生活中WAAY更好:))