2013-01-11 106 views
0

我正試圖用Scala解析元標記。我試着只是做這個用XML匹配,就像解析Scala中的HTML元標記

`html // meta ...` etc, 

,但我得到一個畸形的XML錯誤,因爲這個特定頁面上的這些元標籤沒有結束標籤或... />外殼。

所以以下HTML,

val html = """<meta name="description" content="This is some meta description">""" 

我使用正則表達式如下匹配:

val metaDescription = """.*meta name="Description" content="([^"]+)"""".r 
  • 當我嘗試搭配val metaDescription(desc) = html我得到一個scala.MatchError。
  • 當我嘗試metaDescription.findAllIn(html)並重復時,我得到整個字符串 - 不僅僅是描述。

我怎樣才能得到content內的值,而不是別的?

編輯

我得到了我想要與結果:

metaDescription.findAllIn(html).matchData foreach { 
    desc => println(desc.group(1)) 
} 

,但似乎像繞很長的路要走。有更好的解決方案嗎?

+1

您應該使用html解析庫 –

+0

要重複上述情緒,您應該使用html解析庫。 Html在創建自己的正則表達式時非常難以解析,讓其他人爲您完成工作。這也是SO的規範答案,看看任何有關使用正則表達式解析html的答案,並且您會發現使用解析庫會更好。 –

回答

2

Scala XML and TagSoup提供了一種直接在Scala XML中使用標籤湯的方法。

如果你是開放的替代品,然後Scales Xml提供parse html via alternative SAX parsers類似的有用的方法:提供的鏈接

val html = loadXmlReader(htmlStream, parsers = AlternateSAXFactoryPool) 

爲Tagsoup和Nu.Validator例如工廠。

+0

好吧,我同意不重新發明輪子 - 這些都很棒,謝謝 – JennyDanger