Ruby从这个刮HTML(wombat)中获取第二个数字

时间:2014-09-17 13:36:09

标签: ruby-on-rails ruby parsing web-scraping string-parsing

这是HTML的一部分,我试图从中提取一些信息:

<div class="pagination">
  <p>
    <span>Showing</span>
    1-30
    of 3744
    <span>results</span>
  </p>
</div>

我只是希望从我拉出的位(3744内的所有内容)中存储<p>,但由于of 3744没有任何CSS,我很难过样式,我根本不理解XPath:)

<span>Showing</span>1-30\nof 3744<span>results</span>

如何解析上面的字符串以仅检索结果总数?

2 个答案:

答案 0 :(得分:2)

只要它看起来一直相同,您也可以使用#scan来获取最后一个数字。

str = '<div class="pagination">
           <p>
             <span>Showing</span>
                1-30
                of 3744
             <span>results</span>
           </p>
       </div>'
str.scan(/\d+/).pop.to_i
#=> 3744

更新说明其工作原理

scan会提取所有数字的Array,例如["1","30","3744"]然后它将pop Array "3744"中的最后一个元素,然后将其转换为整数3744

请注意,如果您想要的号码不是Array中的最后一个元素,那么这将无法正常工作。

str = '<div class="pagination">
           <p>
             <span>Showing</span>
                1-30
                of 3744
             <span>results 14</span>
           </p>
       </div>'
str.scan(/\d+/).pop.to_i
#=> 14

正如您所看到的,因为我在结果范围内添加了数字14,现在这是数组中的最后一个数字,结果已关闭。所以你可以把它修改成这样的东西:

 str.gsub(/\s+/,'').scan(/\d+-\d+of(\d+)/).flatten.pop.to_i
 #=> 3744

这将使用gsub删除所有空格,然后查找等同于#{1,}-#{1,}of#{1,}行的某个模式并捕获最后一个组#=> [["3744"]]然后{{1} } flatten Array然后#=> ["3744"]并转换为pop。这似乎是一个更好的解决方案,因为它将确保每次匹配“####”部分。

答案 1 :(得分:1)

使用regexp查看示例Rubular

<span>\w+<\/span>\d\-\d+\\[a-z]+\s(\d+)<span>\w+<\/span>

匹配群组:

3744