【问题标题】:Ruby Web Scrape (Nokogiri) - cleanupRuby Web Scrape (Nokogiri) - 清理
【发布时间】:2016-11-22 14:51:38
【问题描述】:

我正在试验如何从网站上抓取数据。

这是我经过几天研究后整理出来的,但是,Nokogiri 的输出并不像我预期的那样“干净”。当我打印我的数组时,我会在输出中得到很多换行符“/n”。

require 'httparty'
require 'nokogiri'
require 'open-uri'
require 'pry'
require 'csv'

# Assigning the page to scrape
page = HTTParty.get('http://www.realtor.com/realestateandhomes-search/Atlanta_GA/type-single-family-home/price-na-500000')

# Transform the http response into a Nokogiri in order to parse it
parse_page = Nokogiri::HTML(page)

# Create an empty array for property details
details_array = []
parse_page.css('div.srp-item-body').map do |d|
    property_details = d.text
    details_array.push(property_details)
end

Pry.start(binding)

在 Pry 中,如果我显示 details_arrayaddress_array,输出如下所示:

[2] pry(main)> details_array
=> ["\n      \n        \n          \n                2265 Tanglewood Cir NE,\n            Atlanta,\n            GA\n            30345\n \n        \n\n        \n          Dresden East\n        \n        \n\n            $289,900\n          \n          \n            \n        3 bd\n                2 ba\n                1,566 sq ft\n             
0.3 acres lot\n            \n          \n        \n          \n            Single Family Home\n          \n        \n          \n            \n  
Brokered by Re/Max Town And Country\n            \n          \n       
\n        \n          \n            Brokered by \n            Re/Max
Town And Country\n          \n        \n      \n    ",  "\n      \n   
\n          \n                2141 Dunwoody Gln,\n           
Atlanta,\n            GA\n            30338\n          \n        \n\n 
\n          \n            $469,900\n          \n          \n          
\n                4 bd\n                3 ba\n                2,850 sq
ft\n                0.3 acres lot\n                2 car\n           
\n          \n        \n          \n            Single Family Home\n  
\n        \n          \n            \n              Brokered by
Buckhead Home Realty Llc\n            \n          \n        \n       
\n          \n            Brokered by \n            Buckhead Home
Realty Llc\n          \n        \n      \n    ",  "\n      \n       
\n          \n                1048 Martin St SE,\n           
Atlanta,\n            GA\n            30315\n          \n        \n\n 
\n          Intown South\n          Peoplestown\n        \n        \n 
\n            $164,900\n          \n          \n            \n        
5 bd\n                3 ba\n                2,376 sq ft\n             
7,405 sq ft lot\n            \n          \n        \n          \n     
Single Family Home\n          \n        \n          \n            \n  
Brokered by Greenlet Llc\n            \n          \n        \n       
\n          \n            Brokered by \n            Greenlet Llc\n    
\n        \n      \n    ",  "\n      \n        \n          \n         
1048 Martin St SE,\n            Atlanta,\n            GA\n           
30315\n          \n        \n\n        \n          Intown South\n     
Peoplestown\n        \n        \n          \n            $164,900\n   
\n          \n            \n                5 bd\n                3
ba\n                2,055 sq ft\n                7,584 sq ft lot\n    
\n          \n        \n          \n            Single Family Home\n  
\n        \n          \n            \n              Brokered by
Greenlet, Llc\n            \n          \n        \n        \n         
\n            Brokered by \n            Greenlet, Llc\n          \n   
\n      \n    ",  "\n      \n        \n          \n               
1991 Woodbine Ter NE,\n            Atlanta,\n            GA\n         
30329\n          \n        \n\n        \n          Sagamore Hills\n   
\n        \n          \n            $299,900\n          \n          \n
\n                3 bd\n                1+ ba\n                1,449
sq ft\n                0.8 acres lot\n            \n          \n      
\n          \n            Single Family Home\n          \n        \n  
\n           :

【问题讨论】:

  • 您希望在页面源中出现"\n" 的位置有什么? 旁注: details_array = parse_page.css('div.srp-item-body').map(&:text) 会以更红润的方式为您填写 details_array
  • 请阅读“minimal reproducible example”。在询问解析时,提供说明问题的绝对最小 HTML 尤其重要。没有它,我们必须生成它,这会在尝试帮助您时浪费我们的时间。

标签: ruby web nokogiri


【解决方案1】:

您的选择器似乎没有深入研究文档。考虑一下:

require 'nokogiri'

doc = Nokogiri::HTML(<<EOT)
<html>
  <body>
    <div>
      <p>foo</p>
      <p>bar</p>
    </div>
  </body>
</html>
EOT

doc.search('div').map(&:text) # => ["\n      foo\n      bar\n    "]

查看父标记的文本时,您将获得用于格式化 HTML 的两个文本节点,以及所需 &lt;p&gt; 节点的文本。

如果您深入到您想要的实际节点,然后获取它们的文本,您将删除标签间格式:

doc.search('div p').map(&:text) # => ["foo", "bar"]

另见“How to avoid joining all text from Nodes when scraping”。

【讨论】:

  • @Tin Man,非常感谢您提供的信息。通过深入挖掘,我能够清理很多数据,但仍有一些我无法弄清楚。
  • @Tin Man,非常感谢您提供的信息。通过深入挖掘,我能够清理很多数据,但是,仍然有一些我无法弄清楚。我试图在标签看起来像这样的地方拉价格:
  • $100,000
  • 我正在使用以下代码,但似乎不能只得到文本,我仍然得到“\n”....我的代码:parse_property_page.css('li.srp-item-price.srp-items-floated').map (&:text) 输出如下:\n $100,000 \n,任何想法
  • 这还不够。您需要将 minimum HTML 输入数据添加到您的问题中,并以适当的格式显示您正在尝试执行的操作。显然,您的 HTML 比您在评论中提到的 &lt;li ...&gt; 标记中的一点点更复杂。这样想,您需要我们的帮助,因此作为交换,我们希望您做好问题中的准备工作,以帮助我们帮助您。
  • 猜你喜欢
    相关资源
    最近更新 更多
    热门标签