ruby - 使用 Nokogiri 选择随机选择的 <br> 标签之间的所有 <span> 标签

标签 ruby xpath nokogiri

我正在尝试使用 Nokogiri 和 Ruby 解析一些 HTML,但在做我想要的事情时遇到了一些障碍。我的示例文件如下所示:

<div id="main-body">
  <p>
    <span>First Text</span>
    <span>Second Text</span>
    <span>Third Text</span>
    <span>Fourth Text</span>
    <br>
    <span>Fifth Text</span>
    <span>Sixth Text</span>
    <span>Seventh Text</span>
    <br>
    <span>Eight Text</span>
    <span>Ninth Text</span>
    <br>
  </p>
</div

我正在尝试找到一种方法来浏览并仅选择随机中断标签之间或第一次中断之前的文本。

基本上我希望每次的输出都不同。因此示例输出将是例如

=>First Text
=>Second Text
=>Third Text
=>Fourth Text

一次,然后,也许下一次它会在休息 2 和 3 之间得到这些东西

=>Eight Text
=>Ninth Text

我在想,如果我可以计算 HTML 中的中断数量,我就可以使用 rand() 选择一个随机中断并打印出文本,直到我点击下一个中断,但我无法完全理解它正确。

到目前为止,我的代码是将整个页面加载到 Nokogiri 类型中,并尝试从那里进行解析。

doc = Nokogiri::HTML(open(targeturl))
puts doc.xpath("./br").length #gives me the count of break tags in the document

从那里我实际上可以将中断分配给一个变量并一一访问它们,但我不确定该去哪里,或者我什至从这里走在正确的轨道上,我觉得我只是感到困惑我自己此时:/

最佳答案

您可以使用 count()preceding-sibling 根据前面的 br 标记数量来获取节点。

puts doc.xpath("//span[count(preceding-sibling::br)=0]")
#=> <span>First Text</span>
#=> <span>Second Text</span>
#=> <span>Third Text</span>
#=> <span>Fourth Text</span>

puts doc.xpath("//span[count(preceding-sibling::br)=1]")
#=> <span>Fifth Text</span>
#=> <span>Sixth Text</span>
#=> <span>Seventh Text</span>

puts doc.xpath("//span[count(preceding-sibling::br)=2]")
#=> <span>Eight Text</span>
#=> <span>Ninth Text</span>

要获得随机选择,只需随机化前面 sibling 的数量即可:

puts doc.xpath("//span[count(preceding-sibling::br)=#{rand(doc.xpath("//br").length)}]")

关于ruby - 使用 Nokogiri 选择随机选择的 <br> 标签之间的所有 <span> 标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12623902/

相关文章:

ruby-on-rails - 如何从 text_field 生成的输入中删除大小属性?

arrays - 我想使用logstash输入elasticsearch结果创建一个新数组

python - 如何使用 Selenium 和 Python 单击选项卡元素

xml - 如何使用xpath从节点获取属性值?

ruby-on-rails - ActiveSupport 如何计算月总和?

ruby - 如何从私有(private)远程 ip 获取文件名列表

java - 如何使用xpath获取xml中节点的属性值?

ruby - 从标签中提取 HTML5 数据属性

ruby-on-rails - 选择名称以特定字符串开头的所有 XML 元素?

ruby - 搜索 XML 并将节点的子集作为 XML 获取