我正在尝试填补变量parent_element_h1
和parent_element_h2
.任何人都可以帮助我使用Nokogiri将我需要的信息输入到这些变量中吗?
require 'rubygems' require 'nokogiri' value = Nokogiri::HTML.parse(<<-HTML_END) "A
Foo
B
C
Bar
D
E
" HTML_END parent = value.css('body').first # start_here is given: A Nokogiri::XML::Element of theF
with the id 'X2 start_here = parent.at('div.block#X2') # this should be a Nokogiri::XML::Element of the nearest, previous h1. # in this example it's the one with the value 'Foo' parent_element_h1 = # this should be a Nokogiri::XML::Element of the nearest, previous h2. # in this example it's the one with the value 'Bar' parent_element_h2 =
请注意:
start_here
元素可以位于文档中的任何位置.HTML数据只是一个例子.这就是说,头部和
可能是兄弟姐妹
start_here
或兄弟姐妹的孩子start_here
.下面的递归方法是一个很好的起点,但它不起作用,
因为它是一个兄弟的孩子
start_here
:def search_element(_block,_style) unless _block.nil? if _block.name == _style return _block else search_element(_block.previous,_style) end else return false end end parent_element_h1 = search_element(start_here,'h1') parent_element_h2 = search_element(start_here,'h2')
接受答案后,我想出了自己的解决方案.它就像一个魅力,我觉得它非常酷.
1> Aaron Hinni..:我将采用的方法(如果我理解你的问题)是使用XPath或CSS来搜索你的"start_here"元素和你想要搜索的父元素.然后,从父级开始递归地遍历树,当你点击"start_here"元素时停止,并保持与你的风格匹配的最后一个元素.
就像是:
parent = value.search("//body").first div = value.search("//div[@id = 'X2']").first find = FindPriorTo.new(div) assert_equal('Foo', find.find_from(parent, 'h1').text) assert_equal('Bar', find.find_from(parent, 'h2').text)哪里
FindPriorTo
是处理递归的简单类:class FindPriorTo def initialize(stop_element) @stop_element = stop_element end def find_from(parent, style) @should_stop = nil @last_style = nil recursive_search(parent, style) end def recursive_search(parent, style) parent.children.each do |ch| recursive_search(ch, style) return @last_style if @should_stop @should_stop = (ch == @stop_element) @last_style = ch if ch.name == style end @last_style end end如果这种方法不够灵活,那么你可以通过重写
recursive_search
不使用递归来优化事物,并传递你正在寻找的两种样式并跟踪最后找到的样式,所以你没有额外的时间穿越树.我还会说在尝试解析文档时尝试使用Monkey修补Node来挂钩,但看起来所有这些都是用C编写的.也许你可能会更好地使用Nokogiri之外的东西,它有一个原生的Ruby SAX解析器(也许是REXML),或者如果速度是您真正关心的问题,请使用Xerces或类似工具在C/C++中进行搜索.我不知道这些将如何处理解析HTML.
推荐阅读
如何解决《我可以在Cloudwatch仪表板的同一轴上绘制一个指标的多个统计信息吗?》经验,为你挑选了1个好方法。 ... [详细] 如何解决《在ParquetData上使用Avro架构动态创建Hive外部表》经验,为你挑选了1个好方法。 ... [详细] 如何解决《每个屏幕/ViewModel的DbContextLifestyle(WPF+简单注入器)》经验,为你挑选了1个好方法。 ... [详细] 如何解决《获取数据:image/png;base64,{{image}}net::ERR_INVALID_URL》经验,为你挑选了1个好方法。 ... [详细] 如何解决《grailsspring安全角色和组》经验,为你挑选了0个好方法。 ... [详细] 如何解决《SQLAlchemy按子代数进行多对多筛选器行》经验,为你挑选了1个好方法。 ... [详细] 如何解决《"无法验证php文件.找不到php程序"》经验,为你挑选了1个好方法。 ... [详细] 如何解决《如何使residentadvisorAPI工作?》经验,为你挑选了0个好方法。 ... [详细] 如何解决《为什么`:type`有时会显示`a`而有时会显示`t`?》经验,为你挑选了1个好方法。 ... [详细] 如何解决《按另一个列表过滤Python列表》经验,为你挑选了1个好方法。 ... [详细] 如何解决《从第二个2D阵列给出的索引周围的1Dnumpy数组中有效切片窗口》经验,为你挑选了1个好方法。 ... [详细] 如何解决《androidTextInputLayout在将error设置为null后更改EditText样式》经验,为你挑选了1个好方法。 ... [详细] 如何解决《Python点击,你能把-h作为别名》经验,为你挑选了1个好方法。 ... [详细] 如何解决《PHPbase64编码pdf文件》经验,为你挑选了1个好方法。 ... [详细] 如何解决《nltk数据无法安装在AWS实例类型c4.xlarge的Ubuntu14.04上》经验,为你挑选了1个好方法。 ... [详细] 如何解决《什么是uwsgi线程用于?》经验,为你挑选了1个好方法。 ... [详细] 如何解决《简单Play应用程序的最小RAM》经验,为你挑选了1个好方法。 ... [详细] 如何解决《SpringRestWeb服务将文件作为资源返回》经验,为你挑选了0个好方法。 ... [详细] 如何解决《如何在Windows上的Docker中运行Tensorflow运行python脚本?》经验,为你挑选了1个好方法。 ... [详细] 如何解决《opencv,找到一张位于图片特定位置的信件?》经验,为你挑选了1个好方法。 ... [详细]吐了个 "CAO" !Tags | 热门标签RankList | 热门文章
- 1C++指针数组内存分配与普通数组
- 2有没有办法检测Swift项目中的强制解包?
- 3在Java中从Android应用执行Python脚本?
- 4在GWT中做什么(提供=真)?
- 5ASP.NET WebAPI 2嵌套JSON
- 6Android M检测权限对话框是否可见
- 7用于"重复射击"的按下按钮
- 8jwt web令牌应该加密吗?
- 9如何使用redux在首次渲染期间指示异步操作的"加载"状态
- 10GoogleMobileAds.framework:捆绑包格式无法识别,无效或不适合
- 11如何追踪LLVM verifyFunction错误"预计没有前向声明!"?
- 12将unique_ptr的向量传递给函数,const引用
- 13Rails代码中没有路由匹配
- 14Mysql显示按创建日期排序的数据库?
- 15为什么我的WinForms控件看起来平坦?
- 16Numpy和Tensorflow中np.mean和tf.reduce_mean的区别?
- 17c#字典自动打破for循环,
- 18如何在Pandas数据框中按名称选择行列表?
- 19了解Swift中的崩溃报告(部分应用...)
- 20ADB连接错误:无法创建调试桥:无法启动adb服务器:无法检测adb版本,adb输出
DevBox开发工具箱 | 专业的在线开发工具网站 京公网安备 11010802040832号 | 京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有