使用Nokogiri在可怕的HTML中找到部分字符串

时间:2014-10-15 21:40:01

标签: ruby nokogiri

使用Nokogiri,我想获取<span>标记之后的段落部分。

我不是正则表达英雄,在我向前迈进之前,这是我唯一需要发现的东西。列表中唯一的常量是|符号,丑陋的方式是获取整个内容,我猜是splitjoin。希望有一种更聪明,更优雅的方式!

<ul>
<li>
<p>
<strong>I don't care about </strong>
<span>|</span>
this I do care about
</p></li> ...
</ul>

1 个答案:

答案 0 :(得分:1)

如果您的HTML很简单,那么这将有效:

require 'nokogiri'

doc = Nokogiri::HTML(<<EOT)
<ul>
<li>
<p>
<strong>I don't care about </strong>
<span>|</span>
this I do care about
</p></li> ...
</ul>
EOT

doc.at('p').children.last # => #<Nokogiri::XML::Text:0x3ff1995c5b00 "\nthis I do care about\n">
doc.at('p').children.last.text # => "\nthis I do care about\n"

解析HTML和XML实际上是寻找可用于找到所需内容的地标。在这种情况下,<span>可以,但是根据这个内容获取所需的内容并不像查找一个级别那样容易,只需<p>标记,抓取其内容即{{1}选择该列表中的最后一个节点,即包含所需文本的文本节点。

使用children标记的原因不是我要采用的方式,如果HTML格式发生变化,<span>与所需文本之间的节点数可能会发生变化。可以引入包含<span>的干预文本节点来格式化源,这会弄乱简单的索引查找。要解决这个问题,代码必须忽略空白节点并找到非空白节点。

  

我不是正则英雄......

您不应该尝试使用HTML或XML。它们过于灵活,可能会混淆正则表达式,除非你在非常静态的HTML上进行极其琐碎的搜索,除非你正在扫描被遗弃的页面,否则这种情况在真正的互联网上不太可能。相反,学习并依赖可靠的HTML / XML解析器,这可以将页面缩减为DOM,从而可以轻松搜索和遍历标记。

相关问题