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
相关产品推荐
相关产品推荐

