2016-09-27 200 views
1

我試圖用刮機械化網頁,用以下結構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')' –

回答

0

也許該網站內容是通過JavaScript動態加載的。

檢查您的page變量的內容,看看內容是否完整。

如果內容不完整,則意味着必須有一些其他請求,以便serwer返回該數據。您可以搜索它們以打開Chrome DevTools(或其他工具)。在「網絡」標籤中,您將看到網站提出的所有請求。搜索包含您需要的數據的數據,然後通過機械化對其進行刮擦。