2013-01-11 73 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