【发布时间】:2020-06-14 05:15:09
【问题描述】:
对于一个学校项目,我正在尝试抓取多项选择题的内容(为法语 SAT 学习。 screenshot of the webpage that I want to scrape
我的刮刀有效。但是,该页面使用 javascript 获取前 5 个问题,然后您需要回答每个问题并单击下一步按钮,然后您才能访问 5-10 个问题。
在检查器中,我比较了两个 html 文档(单击单选按钮 + 下一步按钮之前和之后),我将两个文件放在了帖子的末尾(第一个 html 文档的形式为 type="get"而第二个具有“post”类型的形式)
因此,我使用 gem Mechanize 并尝试单击所有输入,然后单击按钮。 可悲的是,它不起作用,而且在使用 Mechanize 运行我的代码之前和之后,我似乎有相同的 html 文件。
require 'open-uri'
require 'nokogiri'
require 'json'
require 'mechanize'
url = 'https://www.letudiant.fr/quiz/bac/histoire-geographie/quiz-bac-histoire-geographie-l-es-s-l-asie-du-sud-et-de-l-est-les-enjeux-de-la-croissance/question.html'
agent = Mechanize.new
page = agent.get(url)
form = agent.page.form_with(:class => "c-form")
form.radiobuttons.each do |button|
button.check
end
# check if button.checked?
puts "============"
form.radiobuttons.each do |button|
puts button.checked?
end
puts "============"
puts "************"
page = agent.submit(form)
puts page.parser.text
puts "************"
这会在控制台中返回:这意味着 Mechanize 点击了每个单选按钮(每个问题都有 3 个单选按钮,因此机械化点击了所有这些单选按钮,但只有最后一个仍然被点击(对于每个问题),解释了错误 - 错误 -每个问题的真实重复)like here
============
false
false
true
false
false
true
false
false
true
false
false
true
false
false
true
============
************
#<Mechanize::Page:0x00007fb942c50e38>
Test Quiz Bac L/ES/S - Histoire-Géographie - L'Asie du Sud et de l'Est - L'Etudiant
Quiz Bac Quiz Bac L/ES/S - Histoire-Géographie - L'Asie du Sud et de l'Est Étape 1 Étape 2 1) Mumbai est : Veuillez sélectionner une réponse. a) la capitale politique de l’Union indienne. b) la capitale économique et culturelle de l’Union indienne. c) la capitale culturelle de l’Union indienne. 2) Que sont les slums ? Veuillez sélectionner une réponse. a) Le nom des bidonvilles en Inde. b) Le nom des quartiers aisés en Inde. c) Le nom des décharges en Inde. 3) Comment évolue la population de l’agglomération de Mumbai ? Veuillez sélectionner une réponse. a) Une croissance lente. b) Une stagnation. c) Une croissance rapide. 4) Quelle est la part de la population de l’Asie du Sud et de l’Est dans la population mondiale ? Veuillez sélectionner une réponse. a) 2/3. b) 1/4. c) 1/2. 5) Que signifie « PMA » ? Veuillez sélectionner une réponse. a) Pays mal avancés. b) Pays les moins avancés. c) Pays mal adaptés.
##################
Attention ! Veuillez répondre à toutes les questions.
#######################
Étape suivante Articles les plus lus Bac S 2018 : tous les sujets et corrigés Grand oral du nouveau bac : ce qui vous attend On connaît la liste des œuvres au programme du bac de français 2020 Pourquoi prendre latin ou grec en option en terminale ? Complémentaires ou expertes, à quoi ressembleront les options maths en terminale ? Bac STMG 2018 : tous les sujets et corrigés Nouveau bac : vous aurez les résultats des E3C le 15 mars Que se passera-t-il si vous ratez votre bac en 2020 ? Bac 2019 : les citations à (bien) utiliser à l’épreuve de philo E3C : ce que vous risquez si vous les manquez window._taboola = window._taboola || []; _taboola.push({ mode: 'thumbnails-right-rail', container: 'taboola-right-rail-thumbnails', placement: 'Right Rail Thumbnails', target_type: 'mix' });
Quiz Bac L/ES/S - Histoire-Géographie - L'Asie du Sud et de l'Est
************
句子“注意!Veuillez répondre à toutes les questions”。在控制台中的######之间,表示 Mechanize 尝试提交表单但没有点击每个单选按钮Like here when I try to click without having clicked on the radiobuttons
这是点击每个单选按钮并点击下一个按钮之前的代码(在检查器中找到):
<form class="c-form has-error" method="post" data-frm="quiz" data-frm-legacy-final-step-action="/test/quiz/validation.html?time=1583184886" data-frm-init="1">
<div data-sln-scrollnav="" data-eng-scrollable="" class="c-scrollnav has-more-on-right">
<nav class="c-simple-nav c-scrollnav__scroller" data-sln-scroller="">
<ul class=" c-simple-nav__list c-simple-nav__list--progress " data-sln-inner="">
<li class="c-simple-nav__item"> <a class=" c-simple-nav__link is-active is-clickable " href="#" data-frm-legacy-multi-step="Etape 1"> Étape 1 </a> </li>
<li class="c-simple-nav__item"> <a class=" c-simple-nav__link " href="#" data-frm-legacy-multi-step="Etape 2"> Étape 2 </a> </li>
</ul>
</nav>
</div>
<ol class="c-quiz__question-list">
<li class="c-quiz-question has-error" data-frm-validate="[ 'required' ]">
<h5 class="c-quiz-question__title"> 1) Mumbai est : </h5>
<div class="c-block-error">
<div class="c-block-error__title">
<div class="c-block-bubble c-block-bubble--error">
<svg class="c-icon-svg" aria-hidden="true">
<use xlink:href="/svg/etu.sprite.svg#icon-exclamation"></use>
</svg>
</div>
Veuillez sélectionner une réponse.
</div>
</div>
<div class="c-quiz-question__options">
<label class=" c-radio-label u-themed ">
<input type="radio" name="question_21887" value="66881"> <span class="c-radio-label__label"> a) la capitale politique de l’Union indienne. </span>
<div class="c-radio__indicator"></div>
</label>
<label class=" c-radio-label u-themed ">
<input type="radio" name="question_21887" value="66883"> <span class="c-radio-label__label"> b) la capitale économique et culturelle de l’Union indienne. </span>
<div class="c-radio__indicator"></div>
</label>
<label class=" c-radio-label u-themed ">
<input type="radio" name="question_21887" value="66885"> <span class="c-radio-label__label"> c) la capitale culturelle de l’Union indienne. </span>
<div class="c-radio__indicator"></div>
</label>
</div>
</li>
<li class="c-quiz-question has-error" data-frm-validate="[ 'required' ]">
<h5 class="c-quiz-question__title"> 2) Que sont les slums ? </h5>
<div class="c-block-error">
<div class="c-block-error__title">
<div class="c-block-bubble c-block-bubble--error">
<svg class="c-icon-svg" aria-hidden="true">
<use xlink:href="/svg/etu.sprite.svg#icon-exclamation"></use>
</svg>
</div>
Veuillez sélectionner une réponse.
</div>
</div>
<div class="c-quiz-question__options">
<label class=" c-radio-label u-themed ">
<input type="radio" name="question_21889" value="66887"> <span class="c-radio-label__label"> a) Le nom des bidonvilles en Inde. </span>
<div class="c-radio__indicator"></div>
</label>
<label class=" c-radio-label u-themed ">
<input type="radio" name="question_21889" value="66889"> <span class="c-radio-label__label"> b) Le nom des quartiers aisés en Inde. </span>
<div class="c-radio__indicator"></div>
</label>
<label class=" c-radio-label u-themed ">
<input type="radio" name="question_21889" value="66891"> <span class="c-radio-label__label"> c) Le nom des décharges en Inde. </span>
<div class="c-radio__indicator"></div>
</label>
</div>
</li>
<li class="c-quiz-question has-error" data-frm-validate="[ 'required' ]">
<h5 class="c-quiz-question__title"> 3) Comment évolue la population de l’agglomération de Mumbai ? </h5>
<div class="c-block-error">
<div class="c-block-error__title">
<div class="c-block-bubble c-block-bubble--error">
<svg class="c-icon-svg" aria-hidden="true">
<use xlink:href="/svg/etu.sprite.svg#icon-exclamation"></use>
</svg>
</div>
Veuillez sélectionner une réponse.
</div>
</div>
<div class="c-quiz-question__options">
<label class=" c-radio-label u-themed ">
<input type="radio" name="question_21891" value="66893"> <span class="c-radio-label__label"> a) Une croissance lente. </span>
<div class="c-radio__indicator"></div>
</label>
<label class=" c-radio-label u-themed ">
<input type="radio" name="question_21891" value="66895"> <span class="c-radio-label__label"> b) Une stagnation. </span>
<div class="c-radio__indicator"></div>
</label>
<label class=" c-radio-label u-themed ">
<input type="radio" name="question_21891" value="66897"> <span class="c-radio-label__label"> c) Une croissance rapide. </span>
<div class="c-radio__indicator"></div>
</label>
</div>
</li>
<li class="c-quiz-question has-error" data-frm-validate="[ 'required' ]">
<h5 class="c-quiz-question__title"> 4) Quelle est la part de la population de l’Asie du Sud et de l’Est dans la population mondiale ? </h5>
<div class="c-block-error">
<div class="c-block-error__title">
<div class="c-block-bubble c-block-bubble--error">
<svg class="c-icon-svg" aria-hidden="true">
<use xlink:href="/svg/etu.sprite.svg#icon-exclamation"></use>
</svg>
</div>
Veuillez sélectionner une réponse.
</div>
</div>
<div class="c-quiz-question__options">
<label class=" c-radio-label u-themed ">
<input type="radio" name="question_21893" value="66899"> <span class="c-radio-label__label"> a) 2/3. </span>
<div class="c-radio__indicator"></div>
</label>
<label class=" c-radio-label u-themed ">
<input type="radio" name="question_21893" value="66901"> <span class="c-radio-label__label"> b) 1/4. </span>
<div class="c-radio__indicator"></div>
</label>
<label class=" c-radio-label u-themed ">
<input type="radio" name="question_21893" value="66903"> <span class="c-radio-label__label"> c) 1/2. </span>
<div class="c-radio__indicator"></div>
</label>
</div>
</li>
<li class="c-quiz-question has-error" data-frm-validate="[ 'required' ]">
<h5 class="c-quiz-question__title"> 5) Que signifie « PMA » ? </h5>
<div class="c-block-error">
<div class="c-block-error__title">
<div class="c-block-bubble c-block-bubble--error">
<svg class="c-icon-svg" aria-hidden="true">
<use xlink:href="/svg/etu.sprite.svg#icon-exclamation"></use>
</svg>
</div>
Veuillez sélectionner une réponse.
</div>
</div>
<div class="c-quiz-question__options">
<label class=" c-radio-label u-themed ">
<input type="radio" name="question_21895" value="66905"> <span class="c-radio-label__label"> a) Pays mal avancés. </span>
<div class="c-radio__indicator"></div>
</label>
<label class=" c-radio-label u-themed ">
<input type="radio" name="question_21895" value="66907"> <span class="c-radio-label__label"> b) Pays les moins avancés. </span>
<div class="c-radio__indicator"></div>
</label>
<label class=" c-radio-label u-themed ">
<input type="radio" name="question_21895" value="66909"> <span class="c-radio-label__label"> c) Pays mal adaptés. </span>
<div class="c-radio__indicator"></div>
</label>
</div>
</li>
</ol>
<div class="c-form__errors">
<div class="c-block-error">
<div class="c-block-error__title">
<div class="c-block-bubble c-block-bubble--error">
<svg class="c-icon-svg" aria-hidden="true">
<use xlink:href="/svg/etu.sprite.svg#icon-exclamation"></use>
</svg>
</div>
Attention ! Veuillez répondre à toutes les questions.
</div>
</div>
</div>
<input type="hidden" data-frm-legacy-multi-step-input="" name="step"> <input type="hidden" name="previousStep" value=""> <input type="hidden" name="nextStep" value="2"> <input type="hidden" name="idOrigine" value="1"> <input type="hidden" name="legacyFinalStepAction" value="/quiz/bac/histoire-geographie/quiz-bac-histoire-geographie-l-es-s-l-asie-du-sud-et-de-l-est-les-enjeux-de-la-croissance/conclusion.html?time=1583184886" ?="">
<div class="c-quiz__actions">
<button class="c-button c-button--medium c-button--rounded c-button--light-border u-themed is-active u-typo--upper" type="button" data-frm-legacy-multi-step="next">
<span>Étape suivante</span>
<svg class="c-icon-svg">
<use xlink:href="/svg/etu.sprite.svg#icon-chevron-right"></use>
</svg>
</button>
</div>
</form>
这是我想要获取的 html 代码(在单击每个单选按钮并单击下一个按钮后在检查器中找到:
<form class="c-form" method="post" data-frm="quiz" data-frm-legacy-final-step-action="/test/quiz/validation.html?time=1583187387" data-frm-init="1">
<div data-sln-scrollnav="" data-eng-scrollable="" class="c-scrollnav has-more-on-right">
<nav class="c-simple-nav c-scrollnav__scroller" data-sln-scroller="">
<ul class=" c-simple-nav__list c-simple-nav__list--progress " data-sln-inner="">
<li class="c-simple-nav__item"> <a class=" c-simple-nav__link is-clickable " href="#" data-frm-legacy-multi-step="Etape 1"> Étape 1 </a> </li>
<li class="c-simple-nav__item"> <a class=" c-simple-nav__link is-active is-clickable " href="#" data-frm-legacy-multi-step="Etape 2"> Étape 2 </a> </li>
</ul>
</nav>
</div>
<ol class="c-quiz__question-list">
<li class="c-quiz-question" data-frm-validate="[ 'required' ]">
<h5 class="c-quiz-question__title"> 6) Parmi ces trois États, quel est celui dont la population croît la plus vite ? </h5>
<div class="c-block-error">
<div class="c-block-error__title">
<div class="c-block-bubble c-block-bubble--error">
<svg class="c-icon-svg" aria-hidden="true">
<use xlink:href="/svg/etu.sprite.svg#icon-exclamation"></use>
</svg>
</div>
Veuillez sélectionner une réponse.
</div>
</div>
<div class="c-quiz-question__options">
<label class=" c-radio-label u-themed ">
<input type="radio" name="question_21897" value="66911"> <span class="c-radio-label__label"> a) L’Inde. </span>
<div class="c-radio__indicator"></div>
</label>
<label class=" c-radio-label u-themed ">
<input type="radio" name="question_21897" value="66913"> <span class="c-radio-label__label"> b) Le Japon. </span>
<div class="c-radio__indicator"></div>
</label>
<label class=" c-radio-label u-themed ">
<input type="radio" name="question_21897" value="66915"> <span class="c-radio-label__label"> c) La Chine. </span>
<div class="c-radio__indicator"></div>
</label>
</div>
</li>
<li class="c-quiz-question" data-frm-validate="[ 'required' ]">
<h5 class="c-quiz-question__title"> 7) Lequel de ces États est une démocratie ? </h5>
<div class="c-block-error">
<div class="c-block-error__title">
<div class="c-block-bubble c-block-bubble--error">
<svg class="c-icon-svg" aria-hidden="true">
<use xlink:href="/svg/etu.sprite.svg#icon-exclamation"></use>
</svg>
</div>
Veuillez sélectionner une réponse.
</div>
</div>
<div class="c-quiz-question__options">
<label class=" c-radio-label u-themed ">
<input type="radio" name="question_21899" value="66917"> <span class="c-radio-label__label"> a) La Chine. </span>
<div class="c-radio__indicator"></div>
</label>
<label class=" c-radio-label u-themed ">
<input type="radio" name="question_21899" value="66919"> <span class="c-radio-label__label"> b) L’Inde. </span>
<div class="c-radio__indicator"></div>
</label>
<label class=" c-radio-label u-themed ">
<input type="radio" name="question_21899" value="66921"> <span class="c-radio-label__label"> c) La Corée du Nord. </span>
<div class="c-radio__indicator"></div>
</label>
</div>
</li>
<li class="c-quiz-question" data-frm-validate="[ 'required' ]">
<h5 class="c-quiz-question__title"> 8) Les relations économiques entre la Chine et le Japon se caractérisent par : </h5>
<div class="c-block-error">
<div class="c-block-error__title">
<div class="c-block-bubble c-block-bubble--error">
<svg class="c-icon-svg" aria-hidden="true">
<use xlink:href="/svg/etu.sprite.svg#icon-exclamation"></use>
</svg>
</div>
Veuillez sélectionner une réponse.
</div>
</div>
<div class="c-quiz-question__options">
<label class=" c-radio-label u-themed ">
<input type="radio" name="question_21901" value="66923"> <span class="c-radio-label__label"> a) des conflits. </span>
<div class="c-radio__indicator"></div>
</label>
<label class=" c-radio-label u-themed ">
<input type="radio" name="question_21901" value="66925"> <span class="c-radio-label__label"> b) de la concurrence. </span>
<div class="c-radio__indicator"></div>
</label>
<label class=" c-radio-label u-themed ">
<input type="radio" name="question_21901" value="66927"> <span class="c-radio-label__label"> c) de la complémentarité. </span>
<div class="c-radio__indicator"></div>
</label>
</div>
</li>
<li class="c-quiz-question" data-frm-validate="[ 'required' ]">
<h5 class="c-quiz-question__title"> 9) À quelle instance la Chine refuse-t-elle la candidature du Japon ? </h5>
<div class="c-block-error">
<div class="c-block-error__title">
<div class="c-block-bubble c-block-bubble--error">
<svg class="c-icon-svg" aria-hidden="true">
<use xlink:href="/svg/etu.sprite.svg#icon-exclamation"></use>
</svg>
</div>
Veuillez sélectionner une réponse.
</div>
</div>
<div class="c-quiz-question__options">
<label class=" c-radio-label u-themed ">
<input type="radio" name="question_21903" value="66929"> <span class="c-radio-label__label"> a) L’ONU. </span>
<div class="c-radio__indicator"></div>
</label>
<label class=" c-radio-label u-themed ">
<input type="radio" name="question_21903" value="66931"> <span class="c-radio-label__label"> b) L’OMC. </span>
<div class="c-radio__indicator"></div>
</label>
<label class=" c-radio-label u-themed ">
<input type="radio" name="question_21903" value="66933"> <span class="c-radio-label__label"> c) Le Conseil de sécurité de l’ONU. </span>
<div class="c-radio__indicator"></div>
</label>
</div>
</li>
<li class="c-quiz-question" data-frm-validate="[ 'required' ]">
<h5 class="c-quiz-question__title"> 10) Quel État est chargé d’assurer la protection militaire du Japon ? </h5>
<div class="c-block-error">
<div class="c-block-error__title">
<div class="c-block-bubble c-block-bubble--error">
<svg class="c-icon-svg" aria-hidden="true">
<use xlink:href="/svg/etu.sprite.svg#icon-exclamation"></use>
</svg>
</div>
Veuillez sélectionner une réponse.
</div>
</div>
<div class="c-quiz-question__options">
<label class=" c-radio-label u-themed ">
<input type="radio" name="question_21905" value="66935"> <span class="c-radio-label__label"> a) Le Royaume-Uni. </span>
<div class="c-radio__indicator"></div>
</label>
<label class=" c-radio-label u-themed ">
<input type="radio" name="question_21905" value="66937"> <span class="c-radio-label__label"> b) Les États-Unis. </span>
<div class="c-radio__indicator"></div>
</label>
<label class=" c-radio-label u-themed ">
<input type="radio" name="question_21905" value="66939"> <span class="c-radio-label__label"> c) La Chine. </span>
<div class="c-radio__indicator"></div>
</label>
</div>
</li>
</ol>
<div class="c-form__errors">
<div class="c-block-error">
<div class="c-block-error__title">
<div class="c-block-bubble c-block-bubble--error">
<svg class="c-icon-svg" aria-hidden="true">
<use xlink:href="/svg/etu.sprite.svg#icon-exclamation"></use>
</svg>
</div>
Attention ! Veuillez répondre à toutes les questions.
</div>
</div>
</div>
编辑:为了更精确,我添加了一些代码和细节,希望我的问题更容易理解。
【问题讨论】:
-
需要更多信息来帮助您解决这个问题...页面是否使用 Javascript 处理表单提交?在这种情况下,您可能会更轻松地使用 Selenium 等自动化浏览器,而不是像 mechanize 这样的 HTML 解析器。
-
机械化应该可以做到。听起来“下一步”按钮不是 所以 mechanize 不会提交表单。尝试使用 form.button_with(:class=> "c-button").click 进行下一步,然后使用实际的提交按钮提交。
-
欢迎来到 SO!请参阅“How to Ask”以及链接页面和“MCVE”。在寻求帮助调试时,我们需要在问题本身中复制问题的最小输入数据(HTML)。如果没有,您要求我们下载页面,确定哪个部分导致问题,然后编写一个工具来使用您的代码。我们还需要准确了解您对结果的期望。
标签: ruby-on-rails ruby nokogiri screen-scraping mechanize