从html页面抓取内容

时间:2018-01-03 01:06:11

标签: ruby web-scraping nokogiri

我正在使用nokogiri来抓取网页。页面的结构由包含多个列表项的无序列表组成,每个列表项都有一个包含在div中的链接,图像和文本。

我试图找到干净的方法来提取每个列表项中的元素,这样我就可以将每个li包含在数组或哈希中,如下所示:

li[0] = ['Acme co 1', 'image1.png', 'Customer 1 details']
li[1] = ['Acme co 2', 'image2.png', 'Customer 2 details'] 

目前,我将所有元素集中在一起,然后将它们存储在单独的数组中。这样做有更好,更惯用的方法吗?

这是代码atm:

data = Nokogiri::HTML(html)
images = []
name = []
data.css('ul li img').each {|l| images << l}
data.css('ul li a').each {|a| names << a.text }

这是我工作的html:

<ul class="customers">
  <li>
    <div>
     <a href='#' class="company-name"> Acme co 1 </a>

      <div class="customer-image">
        <img src="image1.png"/>
      </div>

     <div class=" customer-description">
       Cusomter 1 details
     </div>
    </div>

   </li>

   <li>
     <div>
       <a href='#' class="company-name"> Acme co 2</a>
        <div class="customer-image">
         <img src="image1.png"/>
        </div>

       <div class=" customer-description">
         Customer 2 details
       </div>
     </div>

   </li>

</ul>

由于

2 个答案:

答案 0 :(得分:1)

假设您拥有的代码正在为您提供您想要的代码,我将不会尝试重写任何有意义的代码。通过将#each方法替换为#map

,您可以更加简洁和惯用
data = Nokogiri::HTML(html)
images = data.css('ul li img')
names = data.css('ul li a').map(&:text)

答案 1 :(得分:1)

data = Nokogiri::HTML(html)
images = data.css('ul li img')
names = data.css('ul li a').map(&:text)

这会略微简化您的代码,但您的原始版本并不太糟糕。

如果您正在从页面上的多个区域抓取图像,那么我的简化可能无法概括!在这种情况下,恢复到原来的状态可能没问题。