簡體   English   中英

不區分大小寫的標簽與xml-conduit匹配?

[英]case insensitive tag matching with xml-conduit?

使用xml-conduit執行不區分大小寫的標記和屬性名稱匹配的最佳方法是什么?

例如,考慮FP Complete的Haskell學校HTML解析示例中的findNodes函數:

https://www.fpcomplete.com/school/starting-with-haskell/libraries-and-frameworks/text-manipulation/tagsoup

-- The data we're going to search for
findNodes :: Cursor -> [Cursor]
findNodes = element "span" >=> attributeIs "class" "sb_count" >=> child

(我將這一行修改為可以與Bing當前頁面結構一起使用。)

我的實驗表明,匹配名稱時elementattributeIs不執行不區分大小寫的比較。 有沒有簡單的方法可以改變這一點?

我找到了一種解決方法...仍然對更清潔的解決方案感興趣。

基本上,我們只是創建自己的Text.HTML.DOM版本,該版本在創建XML樹之前就在標簽事件流中修復了標簽和屬性名稱。

函數eventConduit像這樣開始:

eventConduit :: Monad m => Conduit S.ByteString m XT.Event
eventConduit =
    TS.tokenStream =$= go []
  where
    go stack = do
        mx <- await
        case fmap (entities . fmap' (decodeUtf8With lenientDecode)) mx of
            Nothing -> closeStack stack
...

我們將case fmap ...行更改為:

        case fmap (entities . fixNames . fmap' (decodeUtf8With lenientDecode)) mx of

fixNames定義為:

fixNames :: TS.Token' Text -> TS.Token' Text
fixNames (TS.TagOpen x pairs b) = TS.TagOpen (T.toLower x) (map (T.toLower *** id) pairs) b
fixNames (TS.TagClose x)        = TS.TagClose (T.toLower x)
fixNames t                      = t

現在我們只在elementattributeIs使用小寫名稱。

匹配元素時,可以使用laxElement忽略大小寫。 它還將忽略名稱空間。 checkName周圍checkName具有您要查找的確切語義的包裝應該很容易。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM