2008-08-28 55 views
5

我試圖從各種博客中獲取一些HTML,並注意到不同的提供者以不同的方式使用相同的標記。獲取變化的HTML標記的最佳方法

例如,下面是使用META NAME發電機標記不同的兩大供應商:

  • 博客:<meta content='blogger' name='generator'/>(第一內容,名字後面,是的,單引號!)
  • 的WordPress:<meta name="generator" content="WordPress.com" /> (名稱第一,內容稍後)

有沒有辦法提取所有情況下的內容值(單/雙引號,行中的第一個/最後一個)?

P.S.儘管我使用的是Java,但如果它在普通表達式的正常表達式的地方,答案可能會幫助更多的人。

回答

14

答案是:不使用正則表達式

說真的。如果您碰巧知道它是有效的XML(可能幾乎從不是真的),請使用SGML分析器或XML分析器。你絕對會搞砸,並浪費大量時間試圖讓它正確。只要使用已有的東西即可。

2

根據XHTML標準,這些差異並不重要。

換句話說,他們是完全一樣的東西。

此外,如果您用單引號替換雙引號將是相同的。

'正常化'一個xml文檔的典型方法是使用一些將該文檔視爲其Infoset表示的API來削減它。 DOM和SAX風格的API都以這種方式工作。

如果你想手動解析它們(或者用RegEx),你必須在你的代碼中複製所有這些東西,並且在我看來,這是不實際的。

3

實際上,您應該使用某種HTML解析器,您可以在該頁面的DOM中檢查每個節點(因此也可以檢查節點屬性)。我沒有使用任何這些一段時間,所以我不知道利弊,但這裏是一個列表http://java-source.net/open-source/html-parsers

2

注意:單引號(即使沒有引號,如果該值不包含空格)根據the W3C HTML spec有效。引用:

默認情況下,SGML要求所有屬性值使用或者雙引號(ASCII十進制34)或單引號(ASCII十進制39)分隔...在某些情況下,作者可以指定值屬性沒有任何引號。

此外,不要忘記,屬性的順序可以顛倒,其他屬性可以出現在標籤中。

0

好吧,既然您正在尋找與語言無關的信息,那麼您可以嘗試REGEXEX,如/<meta\s.*content=.*>/,並從中得出結果並解析出您正在查找的特定值。我絕不是REGEX專家,所以可能有更好的方法,但是在http://www.codehouse.com/webmaster_tools/regex/上使用該工具時,我匹配了您提供的兩個字符串。

1

你可能想給Java的HTMLEditorKit一槍。通過試驗可以很容易地看到解析是否提供了您正在尋找的內容。

0

如果必須使用正則表達式,這裏是一個正則表達式來得到的只是內容的一部分:

content\s*=\s*['"].*?['"] 

回報

content = "blogger" 

content='Worpress.com' 

分別。我不是正則表達式專家,但在regexpal中給出您的示例時,它會得到這些結果。

一旦你得到了,你可以得到所有的報價之間的所有選擇,不管你選擇,是另一個正則表達式(這只是不道德的)或只是循環的字符。

0

如果你使用java,你可能想看看tagsoup,這是一個SAX兼容的解析器,用於「解析HTML」,因爲它可以在野外找到。