Robobrowser. Как заполнить входные данные без атрибута name

#python #python-2.7

#python #python-2.7

Вопрос:

  <form class="form form_horizontal" novalidate="">
 <div class="form__field">
  <label class="form__label">
      <span class="tanker-text">получить ссылку наamp;nbsp;приложение поamp;nbsp;смс</span>. 
  </label>
  <div class="y-input y-input_theme_normal y-input_clearable y-input_size_m y-input_width_ form__input">
     <div class="y-input__box">
        ::before
        <span class="y-input__clear"></span>
 <input type="tel" value="" maxlength="20" placeholder=" 7XXXXXXXXXX" cols="10" class="y-input__control">
  </div>
  </div>
  </div>
   <button type="submit" class="y-button y-button_theme_action y-button_size_l y-button_type_submit form__button" role="button" aria-haspopup="true">
 <span class="y-button__text"><span class="tanker-text">Получить</span></span>. 
  </button>
  <noscript></noscript>
  

Пробовал это для заполнения числового поля, но это не работает

 from robobrowser import RoboBrowser
import re


rb =  RoboBrowser(history=True)
rb.open('myurl')


ff = rb.get_form(class_ = 'form form_horizontal')
ff['y-input__control'].value = 'myphonenumber' 
  

Как найти это поле и заполнить его? И после отправки формы?

Комментарии:

1. для отладки print(ff.keys()) выведите [] . Поэтому не удается использовать ff['y-input__control'] .

2. @Winner я написал print(rb.get_forms()) я получаю это []. означает, что формы на сайте нет?

3. Да, так что он не может быть выбран без name. пожалуйста, используйте yInputControl = rb.find(class_='y-input__control') для выбора.

4. @Winner возвращает ‘None’. Возможно ли найти это поле без имени? или следует использовать другой модуль, например ‘mechanize’?

Ответ №1:

Я тестировал с приведенным ниже кодом

HTML:

 <form class="form form_horizontal" novalidate="" action="http://localhost:3000/test" method="POST">
    <div class="form__field">
        <label class="form__label">
            <span class="tanker-text">получить ссылку наamp;nbsp;приложение поamp;nbsp;смс</span>.
        </label>
        <div class="y-input y-input_theme_normal y-input_clearable y-input_size_m y-input_width_ form__input">
            <div class="y-input__box">
                ::before
                <span class="y-input__clear"></span>
                <input type="tel" value="" maxlength="20" placeholder=" 7XXXXXXXXXX" cols="10" class="y-input__control">
            </div>
        </div>
    </div>
    <button type="submit" class="y-button y-button_theme_action y-button_size_l y-button_type_submit form__button"
        role="button" aria-haspopup="true">
        <span class="y-button__text"><span class="tanker-text">Получить</span></span>.
    </button>
</form>
  

Узел:
— Отрисовка HTML
— Для отправки теста формы, созданного POST API(http://localhost:3000/test )

 var express = require('express');
const bodyParser = require('body-parser');
var app = express();
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json())


app.use('/', express.static(__dirname   '/public'));
app.post('/test', (req, res) => {
    console.log('test POST', req.body, req.params);
    res.status(200).json({ status: true })
});

app.listen(3000, function () { console.log('listening') });
  

Python:

 from robobrowser import RoboBrowser
import re

url = 'http://localhost:3000/test.html'
rb =  RoboBrowser()
rb.open(url)


ff = rb.get_form(class_=re.compile('form'))

# yInputControl = rb.find(class_=re.compile(r'y-input__controlb'))
yInputControl = rb.find(class_='y-input__control')
print(yInputControl)
yInputControl.value = 'myphonenumber' 
rb.submit_form(ff)
  

Комментарии:

1. Я обновил ответ с помощью html, node, python. Я запускаю файл python, затем вызывается POST API.