在html中找到某个标签

时间:2014-07-31 18:43:39

标签: haskell html-parsing

我需要在html中找到某个标签(标签本身及其内容):

import Text.XML.Cursor
import Text.HTML.DOM (parseLBS)

page <- simpleHttp "example.com"
let cursor = fromDocument $ parseLBS page
let myTag = cursor -- find the tag <myTag myAttr="some Value">...</<myTag>

如何在响应(游标)中找到标记myTag的名称和属性,知道它存在并且是单一的(没有其他标记具有相同的名称和属性)?

更新

let rightElement e = (TX.elementName e == Data.String.fromString "myTag") && ((Data.String.fromString "myAttr" :: TX.Name, T.pack "some Value") `Map.member` TX.elementAttributes e)

错误:

 Couldn't match type `TX.Name' with `(TX.Name, T.Text)'
    Expected type: Map.Map (TX.Name, T.Text) T.Text
      Actual type: Map.Map TX.Name T.Text
    In the return type of a call of `TX.elementAttributes'
    In the second argument of `Map.member', namely
      `TX.elementAttributes e'

1 个答案:

答案 0 :(得分:2)

最好用checkNode

完成
let rightNode n = case n of
                    NodeElement e -> (elementName e == "myTag") && (("myAttr", "some Value") `member` elementAttributes e)
                    _             -> False
let myTag = head . checkNode rightNode $ cursor -- find the tag <myTag myAttr="some Value">...</<myTag>

我已经在head使用了checkElement,因为您已经说过您确定节点的存在性和唯一性,但更正确的做法是添加某种失败模式,可能是一个带有表明不存在或非唯一的消息的字符串。

编辑:实际上,上面的案例匹配已经在let rightElement e = (elementName e == "myTag") && (("myAttr", "some Value") `member` elementAttributes e) let myTag = head . checkElement rightElement $ cursor -- find the tag <myTag myAttr="some Value">...</<myTag> 函数中为我们包含了:

checkElement

EDIT2:好的,按照要求,让我们稍微扩展一下。从the docs开始,checkElement :: Boolean b => (Element -> b) -> Axis 函数的类型为

type Axis = Cursor -> [Cursor]

其中cursor。因此checkElement将遍历rightElement下的整个子树,并返回与我们将其作为第一个参数的函数匹配的所有元素。在这种情况下,这是我定义的新功能rightElement :: Element -> Bool checkElement :: (Element -> Bool) -> Cursor -> [Cursor] checkElement rightElement :: Cursor -> [Cursor] checkElement rightElement $ cursor :: [Cursor] head . checkElement rightElement $ cursor :: Cursor 。如果它是您所说的要查找的元素(这是标记名称和属性都匹配),则此函数返回True,否则返回False。 &#39; N&#39;并且&#39; e&#39;只是参数名称;是的。

所以,总结一下类型:

{{1}}