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

使用Nokogiri提取两个指定标签之间所有<p>标签的问题求解

解决方案

方案1:直接用XPath筛选(推荐)

你可以直接通过XPath的节点轴和过滤条件一步拿到目标节点,兼容性更强,不需要硬编码p标签的索引:

items = html.at(".repentanceitems-container").css("li.textbox").each do |item|
  # 定位p.quality之后、第一个ul之前的所有p标签
  use_paragraphs = item.xpath(".//a/span/p[@class='quality']/following-sibling::p[not(preceding-sibling::ul)]")
  # 如需提取文本可调用 use_paragraphs.map(&:text)
end

XPath逻辑说明:

  • 先通过p[@class='quality']准确定位起始锚点,避免硬编码索引导致不同物品结构变化时失效
  • following-sibling::p选择该锚点之后的所有同级p标签
  • not(preceding-sibling::ul)过滤掉所有前面已经出现过ul标签的p,自然只保留了第一个ul之前的内容

方案2:基于已定位节点遍历

如果你已经提前定位好了起始和终止节点,可以直接遍历相邻同级节点收集结果,逻辑更直观:

items = html.at(".repentanceitems-container").css("li.textbox").each do |item|
  # 取单个节点而非节点集,注意用at_xpath
  start = item.at_xpath('.//a/span/p[@class="quality"]')
  ending = item.at_xpath('.//a/span/ul[1]')
  
  use_paragraphs = []
  current_node = start.next_sibling
  # 遍历直到碰到终止ul节点
  while current_node && current_node != ending
    use_paragraphs << current_node if current_node.name == 'p'
    current_node = current_node.next_sibling
  end
end

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 06:54:04