我正在尝试使用 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/