如何将cl-html5-parser解析的列表转回HTML?求可靠方案
HTML解析与序列化的格式兼容问题
我需要处理网页内容,流程为:将HTML转换为列表结构→对列表进行操作→再转回HTML。第一步我使用cl-html5-parser完成HTML解析,工具表现良好,但我原以为它自带转回HTML的功能,实际却没有。
我尝试搭配xmls库实现序列化,运行代码如下:
(xmls:write-xml ;take the parsed html and convert back to html (html5-parser:parse-html5 ;parse the html into a list (dex:get "https://example.com/") :dom :xmls) ;get the html (open "text2.txt") ; stream, required by xmls )
执行后出现以下错误:
debugger invoked on a SB-KERNEL:CASE-FAILURE @B8012CA9EA in thread #<THREAD tid=358582 "main thread" RUNNING {1200BE8143}>: ("html" (("lang" "en")) ("head" NIL ("title" NIL "Example Domain") ("meta" (# #)) ("style" NIL "body{background:#eee;width:60vw;margin:15vh auto;font-family:system-ui,sans-serif}h1{font-size:1.5em}div{opacity:0.8}a:link,a:visited{color:#348}")) ("body" NIL ("div" NIL ("h1" NIL "Example Domain") ("p" NIL "This domain is for use in documentation examples without needing permission. Avoid use in operations." ("p" NIL #)) " ")) fell through ETYPECASE expression. Wanted one of (XMLS:NODE NUMBER SYMBOL STRING). Type HELP for debugger help, or (SB-EXT:EXIT) to exit from SBCL. restarts (invokable by number or by possibly-abbreviated name): 0: [ABORT] Exit debugger, returning to top level. (XMLS::GENERATE-XML ("html" (("lang" "en")) ("head" NIL ("title" NIL "Example Domain") ("meta" (("name" "viewport") ("content" "width=device-width, initial-scale=1"))) ("style" NIL "body{background:#eee;width:60vw;margin:15vh auto;font-family:system-ui,sans-serif}h1{font-size:1.5em}div{opacity:0.8}a:link,a:visited{color:#348}")) ("body" NIL ("div" NIL ("h1" NIL "Example Domain") ("p" NIL "This domain is for use in documentation examples without needing permission. Avoid use in operations.") ("p" NIL ("a" # "Learn more"))) " ")) #<SB-SYS:FD-STREAM for "file /home/oliver/text2.txt" {12048BD593}> 0) source: (ETYPECASE E (NODE (PROGN (DOTIMES (I (* 2 #)) (WRITE-CHAR #\ S)) (FORMAT S "<~A~@[ xmlns=\"~A\"~]" (NODE-NAME E) (NODE-NS E)) (LOOP FOR A IN (NODE-ATTRS E) DO (PROGN (WRITE-CHAR #\ S) (WRITE-STRING # S) (WRITE-CHAR #\= S) (WRITE-CHAR #\" S) (WRITE-ESCAPED # S) (WRITE-CHAR #\" S)))) (IF (NULL (NODE-CHILDREN E)) (PROGN (WRITE-STRING "/>" S) (IF (> INDENT 0) (WRITE-CHAR #\Newline S))) (PROGN (WRITE-CHAR #\> S) (IF (> INDENT 0) (WRITE-CHAR #\Newline S)) (MAPC #'(LAMBDA # #) (NODE-CHILDREN E)) (IF (> INDENT 0) (PROGN #)) (FORMAT S "</~A>" (NODE-NAME E)) (IF (> INDENT 0) (WRITE-CHAR #\Newline S))))) (NUMBER (GENERATE-XML (TRANSLATE-RAW-VALUE E) S INDENT)) (SYMBOL (GENERATE-XML (TRANSLATE-RAW-VALUE E) S INDENT)) (STRING (PROGN (IF (> INDENT 0) (PROGN (DOTIMES # #))) (WRITE-ESCAPED E S) (IF (> INDENT 0) (WRITE-CHAR #\Newline S)))))
经排查,xmls的列表格式与cl-html5-parser的输出格式不兼容。我想请教两个问题:
- 这类HTML/XML转列表的格式是否有统一标准?
- 能否推荐可靠的一站式工具(支持解析→操作→序列化全流程),或者提供相关实现指导?
内容的提问来源于stack exchange,提问作者Oliver Cox
相关产品推荐
相关产品推荐

