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

Nokogiri解析多行<link>标签时文本分离问题求助

问题诊断与解决方案

首先,我发现了核心问题:你用Nokogiri::HTML解析RSS订阅源,但RSS本质是XML格式,HTML解析器会按照HTML的规则处理标签,这就是<link>标签文本无法正确获取的根源。

HTML里的<link>是自闭合的空标签(比如<link rel="stylesheet">),所以Nokogiri的HTML解析器会把你的<link>当成空元素,后面的URL文本就被解析成了和<link>同级的独立文本节点,而不是<link>的子节点——这就是为什么node.css('link').text返回空字符串。

解决方案一:使用XML解析器(推荐)

把解析方式换成Nokogiri::XML,严格按照XML规则处理标签结构:

require 'open-uri'
doc = Nokogiri::XML(open('https://rss.acast.com/abroadinjapan'))
node = doc.xpath('//item').first # 用XPath或css('item')都可以
node.css('title').text # 正常获取标题
node.css('link').text # 现在能正确拿到URL文本了

解决方案二:如果必须用HTML解析器(不推荐)

如果因为某些原因不能切换到XML解析器,你可以通过获取<link>节点的相邻文本节点来拿到URL:

# 方式1:用next方法获取下一个节点(即目标Text节点)
node.css('link').next.text.strip

# 方式2:遍历子节点,定位<link>之后的文本节点
link_node = node.css('link').first
target_text = node.children.select { |n| n.previous == link_node && n.is_a?(Nokogiri::XML::Text) }.first.text.strip

另外补充个小细节:你用doc.css('//item')其实是在CSS选择器里混用了XPath语法,虽然Nokogiri支持,但更规范的写法是doc.xpath('//item')或者纯CSS选择器doc.css('item')。

内容的提问来源于stack exchange,提问作者Argus9

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:30:41