与机械化

问题描述:

我试图用刮机械化网页,用以下结构CSS选择器使用page.at:与机械化

<div id="searchResultsBox"> 
    <div class="listings-wrap"> 
     <div class="listings-header"> 
     <div class="listing-cat">Category</div> 
     <div class="listing-name">Name</div> 
     </div> 
     <ul class="listings"> 
     <li class="listing"> 
      <a href="/ShowRatings.jsp?tid=1143052"> 
      <span class="listing-cat"> 
       <span class="icon"></span> 
       TEXT 
       </span> 
      <span class="listing-name"> 
       <span class="main">TEXT</span> 
       <span class="sub">TEXT</span> 
      </span> 
      </a> 
     </li> 
     ... 

我想导航到<a> HTML元素背后的页面。现在,我有:

agent = Mechanize.new 
page = agent.get("URL") 
page = page.at('#searchResultsBox > div.listings-wrap > ul > li:nth-child(1) > a') 

但它一直返回NIL(由puts page.class验证)。

我也尝试使用sleep来尝试确保页面在继续之前有时间加载。

有什么我做错了吗?我认为使用CSS选择器可以做到这一点。

+0

你是怎么得到HTML的?如果机械化无法找到该标签,则选择器错误或标签实际上不存在于机械化世界中。添加'sleep'将无济于事,因为Mechanize抓取页面,然后等待您告诉它要找到什么元素;它不会递归地遍历页面并像浏览器那样检索所有内容,这也意味着如果页面的部分被动态加载,那么Mechanize将永远不会看到它们。在命令行使用'nokogiri'来加载页面,然后使用@ doc.at('#searchResultsBox> div.listings-wrap> ul> li:nth-​​child(1)> a')'看看它是否作品。 –

+0

尝试追踪'page.at('div#searchResultsBox a')' –

也许该网站内容是通过JavaScript动态加载的。

检查您的page变量的内容,看看内容是否完整。

如果内容不完整,则意味着必须有一些其他请求,以便serwer返回该数据。您可以搜索它们以打开Chrome DevTools(或其他工具)。在“网络”标签中,您将看到网站提出的所有请求。搜索包含您需要的数据的数据,然后通过机械化对其进行刮擦。