Как я могу получить Mechanize объекты из метода поиска Mechanize :: Page? - PullRequest
4 голосов
/ 04 февраля 2012

Я пытаюсь очистить сайт, где я могу полагаться только на классы и иерархию элементов, чтобы найти правильные узлы. Но использование Mechanize::Page#search возвращает Nokogiri::XML::Element s, которые я не могу использовать для заполнения и отправки форм и т. Д.

Я бы действительно хотел использовать чистые CSS-селекторы, но сопоставление классов кажется довольно простым с различными методами _with. Однако сопоставление таких вещей, как :not(.class), довольно многословно по сравнению с простым использованием CSS-селекторов, в то время как я не знаю, как сопоставить иерархию элементов.

Есть ли способ преобразовать элементы Нокогири обратно в Механизированные объекты или, что еще лучше, получить их прямо из метода search?

1 Ответ

7 голосов
/ 05 февраля 2012

Как указано в этом ответе , вы можете просто построить новый Mechanize::Form объект, используя Nokogiri::XML::Element, полученный с помощью Mechanize::Page#search или Mechanize::Page#at:

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 в элементы Mechanize, а преобразования выполняются там, где онинеобходимы.Следовательно, написание метода, который ищет документ с помощью CSS или XPath и возвращает элементы Mechanize, если это применимо, потребует довольно большого случая переключения на типе узла.Не совсем то, что я себе представлял.

...