如何将一组

放入

2024-01-26

我想找到一种方法来使用以下 Ruby 代码获取 HTML 结果(下面进一步提到)Nokogiri http://github.com/tenderlove/nokogiri/tree/master:

require 'rubygems'
require 'nokogiri'

value = Nokogiri::HTML.parse(<<-HTML_END)
  "<html>
    <body>
      <p id='1'>A</p>
      <p id='2'>B</p>
      <h1>Bla</h1>
      <p id='3'>C</p>
      <p id='4'>D</p>
      <p id='5'>E</p>
    </body>
  </html>"
HTML_END

# The selected-array is given by the application.
# It consists of a sorted array with all ids of 
# <p> that need to be enclosed by the <div>
selected = ["2","3","4"]
first_p = selected.first
last_p = selected.last

#
# WHAT RUBY CODE DO I NEED TO INSERT HERE TO GET
# THE RESULTING HTML AS SEEN BELOW?
#

生成的 HTML 应如下所示(请注意插入的<div id='XYZ'>):

<html>
  <body>
    <p id='1'>A</p>
    <div id='XYZ'>
      <p id='2'>B</p>
      <h1>Bla</h1>
      <p id='3'>C</p>
      <p id='4'>D</p>
    </div>
    <p id='5'>E</p>
  </body>
</html>

在这些情况下,您通常想要使用任何SAX接口 http://en.wikipedia.org/wiki/Simple_API_for_XML底层库为您提供有状态且连续地遍历和重写输入 XML(或 XHTML):

require 'nokogiri'
require 'CGI'

Nokogiri::XML::SAX::Parser.new(
  Class.new(Nokogiri::XML::SAX::Document) {
    def initialize first_p, last_p
      @first_p, @last_p = first_p, last_p
    end

    def start_document
      puts '<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">'
    end

    def start_element name, attrs = []
      attrs = Hash[*attrs]
      @depth += 1 unless @depth.nil?
      print '<div>' if name=='p' && attrs['id'] == @first_p
      @depth = 1    if name=='p' && attrs['id'] == @last_p && @depth.nil?
      print "<#{ [ name, attrs.collect { |k,v| "#{k}=\"#{CGI::escapeHTML(v)}\"" } ].flatten.join(' ') }>"
    end

    def end_element name
      @depth -= 1 unless @depth.nil?
      print "</#{name}>"
      if @depth == 0
        print '</div>'
        @depth = nil
      end
    end

    def cdata_block string
      print "<![CDATA[#{CGI::escapeHTML(string)}]]>"
    end

    def characters string
      print CGI::escapeHTML(string)
    end

    def comment string
      print "<!--#{string}-->"
    end
  }.new('2', '4')
).parse(<<-HTML_END)
  <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
  <html>
    <body>
      <!-- comment -->
      <![CDATA[
        cdata goes here
      ]]>
      &quot;special&quot; entities 
      <p id="1">A</p>
      <p id="2">B</p>
      <p id="3">C</p>
      <p id="4">D</p>
      <p id="5">E</p>
      <emptytag/>
    </body>
  </html>
HTML_END

或者,您也可以使用DOM模型接口 http://en.wikipedia.org/wiki/DOM(而不是 SAX 接口)将整个文档加载到内存中(与您在原始问题中开始执行的方式相同),然后执行节点操作(插入和删除),如下所示:

require 'rubygems'
require 'nokogiri'

doc = Nokogiri::HTML.parse(<<-HTML_END)
  <html>
    <body>
      <p id='1'>A</p>
      <p id='2'>B</p>
      <p id='3'>C</p>
      <p id='4'>D</p>
      <p id='5'>E</p>
    </body>
  </html>
HTML_END

first_p = "2"
last_p = "4"

doc.css("p[id=\"#{first_p}\"] ~ p[id=\"#{last_p}\"]").each { |node|
  div_node = nil
  node.parent.children.each { |sibling_node|
    if sibling_node.name == 'p' && sibling_node['id'] == first_p
      div_node = Nokogiri::XML::Node.new('div', doc)
      sibling_node.add_previous_sibling(div_node)
    end
    unless div_node.nil?
      sibling_node.remove
      div_node << sibling_node
    end
    if sibling_node.name == 'p' && sibling_node['id'] == last_p
      div_node = nil
    end
  }
}

puts doc
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将一组

放入

中 的相关文章

随机推荐

  • 使用 try-with-resources 语句声明 Stream 与不使用 try-with-resources 语句有什么区别?

    在Java 8中 Stream 即AutoCloseable 不能被重用 一旦被消耗或使用 流将被关闭 那么用 try with resources 语句声明的实用程序是什么 try with resources 语句的示例 public
  • 选择量角器中的第一个可见元素

    我正在编写量角器测试并且喜欢它 尽管有时似乎会陷入一些看起来应该很简单的事情 例如 我想循环浏览其中一个页面上包含 提名 文本的所有按钮 页面上有几十个 但只有 1 或 2 个可见 所以我想点击第一个 这是我当前使用的代码 var nomi
  • 在 Rails 模型中动态生成范围

    我想动态生成范围 假设我有以下模型 class Product lt ActiveRecord Base POSSIBLE SIZES small medium large scope small where size small scop
  • 通过 https 运行 Angular Cli Ng Serve 2018

    有没有办法可以通过 https 运行我的 Angular localhost 我尝试了一些不同的教程 但没有任何效果我尝试过 通过 https 为您的 Angular cli 应用程序提供服务 https freerangeeggs net
  • NodeJS Mongo - Mongoose - 动态集合名称

    所以 我想创建一个基于客户端的分区模式 其中我将集合名称设置为 function 我的伪代码是这样的 var mongoose require mongoose Schema mongoose Schema var ConvForUserS
  • 刷新令牌的正确方法

    有一个功能getUser in RequestManager class那叫我的VC func getUser onCompletion escaping result User error String gt Void Alamofire
  • Elmah.MVC 在生产环境中不记录错误

    我使用以下命令将 Elmah MVC 安装到我的 MVC 项目中Elmah MVC Nuget 包 http nuget org packages Elmah MVC 它在开发环境中工作正常 但是当我将网站上传到托管服务器 IIS7 时 它
  • 如何旋转仪表图表中的刻度盘?情节地使用Python

    我最近开始使用plotlypython 中的仪表图包 完成教程和模板后here https plot ly python gauge charts 我想知道是否有办法在给定角度值的情况下旋转 表盘 或 针 有人建议我使用 css 转换做到这
  • 如何将图例放置在带边框的字段集中? [复制]

    这个问题在这里已经有答案了 根据网络上的几个参考文献 不可能定位图例 所以建议用span包裹起来 legend span Foo span legend 然后我们可以将跨度定位在字段集中 但是当我想在字段集顶部添加边框时 图例有一个间隙 幸
  • 使用 openGL 的粒子过滤器扫描线

    我正在用 C 实现用于 3D 立方体跟踪的粒子过滤器 在为粒子分配权重时 我遇到了一个重大问题 因为权重基于样本点和像素之间的距离误差 在本例中 如下所述 目前 我可以从笔记本电脑上的摄像头获取视频流 将其显示在屏幕上并在其上绘制粒子 我还
  • 当要发送的请求是多部分请求时,Spring CSRF 令牌不起作用

    I use Spring 框架 4 0 0 发布 GA Spring Security 3 2 0 发布 正式版 支柱 2 3 16 其中 我使用内置的安全令牌来防范 CSRF 攻击 Struts 表单如下所示
  • 使用 VPN 从 Docker 容器内访问专用网络中的资源

    我在 OSX 上运行 Docker 1 9 1 并使用 Cisco AnyConnect VPN 连接到我的专用工作网络 我在 Docker 容器中运行的服务连接到工作网络内的数据库 并且无法从容器内部访问 但可以从 OSX 中的容器外部访
  • 未捕获的引用错误:当 jquery.js 位于文档末尾时 $ 未定义

    我有一个项目 其中所有 JS 文件都在页脚中引用 这是为了提高页面加载速度而建议的 包括指向 Jquery 文件的链接 这段代码产生了一个 Uncaught ReferenceError 我假设是因为在调用我的脚本之前尚未定义 Jquery
  • 如何从 SQL Server 2005 检索 XML 数据?

    我的脚本 Dim myStream myConnection myCommand Set myStream CreateObject ADODB Stream Set myConnection CreateObject ADODB Conn
  • 修改XML节点但保持XML文件格式不变

    如何修改 XML 文件而不进行任何更改 如属性排序 标签扩展和编码 我的偏好是 DOM API 你可以尝试VTD XML http vtd xml sourceforge net 由于该库在保持文件内容不变的同时构建索引 因此其操作 API
  • 在 Tensorflow 中创建许多特征列

    我正在开始一个 Tensorflow 项目 并且正在定义和创建我的功能列 然而 我有成百上千个特征 这是一个相当广泛的数据集 即使经过预处理和清理 我仍然有很多列 传统的创建方式feature column定义在张量流教程 https ww
  • 让我们加密 SSL 抛出 404

    我刚刚在我的 VPS 上安装了 nginx 并在那里创建了 2 个网站 api school alert cz server server name api school alert cz index index html index ht
  • SQL对同一个表进行多重连接和求和

    我在从事一个项目时正在即时学习 SQL 并且希望在以下方面得到一些帮助 我对 stackoverflow 还很陌生 所以如果我的格式设置错误 我深表歉意 我有一个包含日期 组 人员 金额列的表 每天我都会为每个人记录一个金额和他们所在的组
  • Rust 中的递归生成器导致“递归类型”错误;解决方法?

    我有一个以下形式的构造 pub enum Value Nil Str String Seq Vec
  • 如何将一组

    放入

    我想找到一种方法来使用以下 Ruby 代码获取 HTML 结果 下面进一步提到 Nokogiri http github com tenderlove nokogiri tree master require rubygems requir