2012-02-04 22 views
4

我試圖刮一個網站,我只能依靠類和元素層次結構來找到正確的節點。但是,使用Mechanize::Page#search回報Nokogiri::XML::Element S的,我不能用它來填充和提交表單等如何從Mechanize :: Page的搜索方法獲取機械化對象?

我真的很想使用純CSS選擇器,但上課的匹配似乎是相當直截了當的各種_with方法了。然而,像:not(.class)這樣的匹配相對於簡單地使用CSS選擇器來說相當冗長,而我不知道如何匹配元素層次結構。

有沒有辦法將Nokogiri元素轉換回機械化對象,或者更好地從search方法中直接獲取它們?

+1

您是否有一個表單字段的示例,您無法識別機械化? – 2012-02-05 01:53:05

+0

@mark在相關頁面上的所有表單和表單域都有隨機生成的ID和名稱。當然,沒有任何元素是你無法識別的,因爲你總是可以做某事。像'page.forms [3]'。但使用'page.search'.main-content form''檢索該表單更具有意義,恕我直言,當網站上的某些內容發生變化時可能不太容易中斷。 – raphinesse 2012-02-05 13:31:22

+0

我相信你可以在[這個舊的答案]找到你的答案(http://stackoverflow.com/questions/2469117/nokogiri-error-undefined-method-radiobutton-with-why/6003166#comment11504418_6003166)。 – Phrogz 2012-02-05 14:21:05

回答

7

就像說in this answer您可以使用通過Mechanize::Page#searchMechanize::Page#at檢索您的Nokogiri::XML::Element簡單地構建一個新的Mechanize::Form對象:

a = Mechanize.new 
page = a.get 'https://stackoverflow.com/' 

# Get the search form via ID as a Nokogiri::XML::Element 
form = page.at '#search' 

# Convert it back to a Mechanize::Form object 
form = Mechanize::Form.new form, a, page 

# Use it! 
form.q = 'Foobar' 
result = form.submit 

注意:您必須提供Mechanize對象和Mechanize::Page對象的構造是能夠提交表格。否則,它只是一個沒有上下文的Mechanize::Form對象。


人們似乎沒有中央的效用函數轉換Nokogiri::XML::Element s到機械化的元素,而是在轉換來實現需要的地方。因此,編寫一種通過CSS或XPath搜索文檔並返回Mechanize元素(如果適用)的方法需要在節點類型上有一個相當大的開關情況。不完全是我想象的。

+0

有沒有辦法做到這一點,並獲得相當於一個Page對象而不是一個表單。嘗試Mechanize :: Page.new,它沒有工作... Mech的語法比Nokogiri更容易使用 – Carpela 2015-09-16 10:16:05

+0

@KeiranBetteley您能詳細解釋一下嗎?我不明白你爲什麼需要一個新的頁面對象? – raphinesse 2015-09-16 10:57:33

+0

我想要做的是採取網頁的一個子集,例如page.search(「table.results」),然後在其上使用mechanise方法。 例如result = page.search(「table.results」)。第一個 結果= result.covert_to_mechanize_object links = results.links 這是否更有意義?我想知道是否可以使用原始標題信息創建一個僞造頁面,但只是DOM的特定部分作爲正文 – Carpela 2015-09-16 12:00:44

相關問題