【问题标题】:Having Difficulty Using Nokogiri to Pull <li> Element使用 Nokogiri 拉出 <li> 元素有困难
【发布时间】:2014-07-29 11:05:33
【问题描述】:

我正在尝试开发一个抓取工具来从 NewEgg 中提取内容。我在 Ruby on Rails 上安装了 Nokogiri,据我所知它正在工作。但是,我很难提取包含定价信息的特定元素,而且我不完全确定它为什么不起作用。下面的代码应该查找列表类“price-current”并放置该代码的每个实例。相反,我没有得到任何结果。

require 'rubygems'
require 'open-uri'
require 'nokogiri'

page = Nokogiri::HTML(open("http://www.newegg.com/Product/Product.aspx?Item=N82E16820313436"))   

page.xpath('//li[@class="price-current "]').each do |item|
  puts item
end

在过去的两个小时里,我一直在努力解决这个问题,但没有成功。任何见解将不胜感激!

编辑:所以,@MarkReed 关于我正在寻找由 JS 生成的信息是正确的。查看代码,哈希中似乎有很多细节。是否可以在 Nokogiri 中使用 RegEx 来提取该信息?

  var utag_data = {
  page_breadcrumb:'Home &gt; Computer Hardware &gt; Memory &gt; Desktop Memory &gt; Team Group &gt; Item#:N82E16820313436',
        page_tab_name:'Computer Hardware',
        product_category_id:['17'],
        product_category_name:['Memory'],
        product_subcategory_id:['147'],
        product_subcategory_name:['Desktop Memory'],
        product_id:['20-313-436'],
        product_web_id:['N82E16820313436'],
        product_title:['Team Zeus Yellow 8GB (2 x 4GB) 240-Pin DDR3 SDRAM DDR3 1600 (PC3 12800) Desktop Memory Model TZYD38G1600HC9DC01'],
        product_manufacture:['Team Group'],
        product_unit_price:['79.99'],
        product_sale_price:['66.99'],
        product_default_shipping_cost:['0.01'],
        product_type:['Newegg'],
        product_model:['TZYD38G1600HC9DC01'],
        product_instock:['1'],
        product_group_id:['0'],
        page_type:'Product',
        site_region:'USA',
        site_currency:'USD',
        page_name:'ProductDetail',
        search_scope:jQuery('#haQuickSearchStore option:selected').text(),
        user_nvtc:Web.StateManager.Cookies.get(Web.StateManager.Cookies.Name.NVTC),
        user_name:Web.StateManager.Cookies.get(Web.StateManager.Cookies.Name.LOGIN,'LOGINID6'),
        third_party_render:['3cb31f7b6faf223eb237af8c737abcebce803020','4774d6780334a7bf9c3c95255c60401916d07cae','e3770e5b640207523c7ac0afed2237ce2f79cd27','9c3638f897ed4a655fd0bd839f04e1c412d54bff','78b8b16d9d0f6f2e8419ac12fa710f5153f1cee3','65531e14b4d9b9a223cc3bfcb65ce7b5f356011d','2a5e772a0f941c862180037f8a5c118c7abf2f7d','9011adc5233493f5adc5f0f0f1bcb655892c09e3']

  };

【问题讨论】:

  • 嗯,在那个 URL 上,我没有看到任何带有“price-current”类的元素?事实上,我看到的唯一价格是 Javascript 代码..
  • 嗨@MarkReed - 网站本身有一个列表元素。看这里(i.imgur.com/Dj0iRZx.png)
  • 但是如果在页面加载后通过javascript代码添加,Nokogiri将永远看不到它。
  • 您可能想看看使用Watir 驱动实际浏览器并在 JS 运行后检索 DOM。
  • 要回答您的编辑,理论上您可以使用 Nokogiri 获取 &lt;script&gt; 元素并在其文本中搜索该对象文字,然后尝试使用正则表达式来提取数据。不过,这将是混乱和脆弱的。该文字甚至不是有效的 JSON,因此您无法使用 json 库将其解析为哈希,而无需先对其进行某种基于正则表达式的手术。

标签: ruby-on-rails ruby web-scraping nokogiri


【解决方案1】:

您似乎正在搜索页面加载后由 Javascript 在浏览器中动态添加的 DOM 元素。它们不存在于最初从 URL 获取的 HTML 中,因此 Nokogiri 无法访问。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-06
    • 2016-02-28
    • 2013-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多