You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 00:01:10