xml2::read_html指定options时丢失JSON-LD内HTML闭合标签的技术问询
解决方案:保留JSON-LD中的HTML标签并使用自定义解析选项
问题重现
在R中使用xml2::read_html()默认调用时,能正常保留JSON-LD脚本中的HTML闭合标签:
library(xml2) library(magrittr) library(rvest) test_ld <- '<script type="application/ld+json">{"@context":"http://schema.org","@type":"ReproducibleExample", "description":"<p><strong>text within tags</strong>text after closing tag</p>"' # 默认调用:标签完整保留 test_ld %>% read_html() %>% html_node('script[type="application/ld+json"]') %>% as.character()
输出中description字段的HTML标签完整:<p><strong>text within tags</strong>text after closing tag</p>
但一旦指定任何自定义options参数(如HUGE、NOBLANKS),JSON-LD中的HTML闭合标签会被自动移除:
# 带自定义选项:闭合标签丢失 test_ld %>% read_html(options = 'HUGE') %>% html_node('script[type="application/ld+json"]') %>% as.character()
输出中description字段变为:<p><strong>text within tagstext after closing tag
原因分析
xml2底层依赖libxml2解析HTML,默认情况下libxml2会将<script>标签的内容视为CDATA原始文本,不会解析其中的HTML标签。但当手动指定options参数时,会覆盖默认的解析配置,导致script内容被当作普通HTML解析,其中的闭合标签被错误处理。
解决办法
在自定义options中显式添加SCRIPT_CDATA选项,强制libxml2将script内容视为原始文本,从而保留其中的HTML标签。示例代码如下:
1. 结合HUGE选项使用
test_ld %>% read_html(options = c('HUGE', 'SCRIPT_CDATA')) %>% html_node('script[type="application/ld+json"]') %>% as.character()
2. 结合NOBLANKS选项使用
test_ld %>% read_html(options = c('NOBLANKS', 'SCRIPT_CDATA')) %>% html_node('script[type="application/ld+json"]') %>% as.character()
3. 空选项场景
如果需要使用空选项但保留默认的script处理行为,同样显式添加SCRIPT_CDATA:
test_ld %>% read_html(options = 'SCRIPT_CDATA') %>% html_node('script[type="application/ld+json"]') %>% as.character()
以上代码的输出都会完整保留JSON-LD中的HTML闭合标签,同时满足自定义解析选项的需求。
内容的提问来源于stack exchange,提问作者sbha
相关产品推荐
相关产品推荐

