首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从html页面抓取内容

从html页面抓取内容
EN

Stack Overflow用户
提问于 2018-01-03 09:06:11
回答 2查看 235关注 0票数 1

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

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

代码语言:javascript
复制
li[0] = ['Acme co 1', 'image1.png', 'Customer 1 details']
li[1] = ['Acme co 2', 'image2.png', 'Customer 2 details'] 

目前,我一次性获取所有元素,然后将它们存储在单独的数组中。有没有更好、更地道的方法来做这件事?

这是自动取款机的代码:

代码语言:javascript
复制
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:

代码语言:javascript
复制
<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>

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-01-03 09:28:38

假设你拥有的代码能满足你的需求,我不会尝试重写任何有意义的东西。通过用#map替换#each方法,可以使您的方法更简洁、更得体

代码语言:javascript
复制
data = Nokogiri::HTML(html)
images = data.css('ul li img')
names = data.css('ul li a').map(&:text)
票数 1
EN

Stack Overflow用户

发布于 2018-01-03 09:28:58

代码语言:javascript
复制
data = Nokogiri::HTML(html)
images = data.css('ul li img')
names = data.css('ul li a').map(&:text)

这稍微简化了您的代码,但您的原始版本并不太差。

例如,如果你要从页面上的多个区域中抓取图像,那么我的简化可能并不适用!在这种情况下,恢复到原始版本可能没问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48069907

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档