私はここで取り組んでいたプロジェクトに取り組んでいます:
関数でモナドトランスフォーマーメソッドを使用すると、次のようになります。
scrapePost :: String -> IO ()
scrapePost url = liftM (fromMaybe ()) . runMaybeT $ do
doc <- lift $ fromUrl url
-- get a bunch of stuff from the page
-- send it to the db
replies <- lift . runX $ doc >>> css ".post.reply"
-- here is the problem
mapM_ (parseReply url (fromJust page_id)) replies
-- here is the problem
parseReply
必要な機能ですが、正しく取得できないようです。
その機能を開始するための私の弱い試みは次のとおりです。
parseReply :: String -> String -> XNode -> Maybe ()
parseReply url op_id reply = do
reply_id <- runX $ reply ! "id"
return ()
ところで、私はHandsomeSoupを使用しています
設定された css ルールを使用して関数と同じように動作しscrapePost
、すべての値を持たない応答をスクレイピングしてドロップし、それらをデータベースに送信します。
mapM
全部交換しmapM
てliftIO
性能差を見たいので使ってみたいです。
[アップデート]
したがって、タイプのアクロバットを行う必要はなく、返信ノードをここで見つけたルート ノードに変換する方法が必要でした。
はコンテキストでparseReply
のみ使用されるため、その型は変更する必要がなく、同じままでかまいません。MaybeT IO ()
scrapePost
parseReply
になります:
toRoot :: ArrowXml a => XmlTree -> a n XmlTree
toRoot node = root [] [constA node]
parseReply :: String -> String -> XmlTree -> MaybeT IO ()
parseReply url op_id reply = do
let node = toRoot reply
reply_id <- lift . liftM (`atMay` 0) $ runX $ node >>> css "div" ! "id"
guard (isJust reply_id)
return ()