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

