我需要在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'
答案 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}}