У меня есть форма HTML, которая динамически генерируется. Я могу управлять кодированием в Php + cURL для автоматического входа на любой сайт. Однако в этом случае имена полей формы меняются каждый раз, когда форма загружается.
Я хотел бы знать, есть ли способ получить имена полей формы после загрузки формы. После этого я могу использовать имена полей формы для дальнейшего управления.
Вам не нужно ограничивать себя Php, но это предпочтительнее.
Я бы загрузил страницу в объект DOMDocument , а затем использовал getElementByTagName с формой, чтобы получить все узлы формы со страницы. вы можете затем просмотреть все имена полей формы.
Вот вам какой-то код для начала, это поможет, если вы знаете атрибут имени формы или что-то в этом роде. Поскольку getElementsByTagName вернет теги формы на странице.
// Create a new DOM Document to hold our webpage structure $xml = new DOMDocument(); // Load the html's contents into DOM @$xml->loadHTML($html); // get each form in a DOMNodeList $forms = $xml->getElementsByTagName('form'); foreach ($forms as $form) { // if you know the form name attribute, you could check it here before continuing... // with $form->getAttribute('name'), and the continue with next iteration if not the right one // loop throught each input tags in the form $inputs = $form->getElementsByTagName('input'); foreach ($inputs as $input) { // get input name attribute and value and ... $inputName = $input->getAttribute('name'); $inputValue = $input->getAttribute('value'); ... } }
Другой способ – использовать выражение Xpath, например:
// Create a new DOM Document to hold our webpage structure $xml = new DOMDocument(); // Load the html's contents into DOM @$xml->loadHTML($html); $oXpath = new DOMXPath($xml); // will return a DOMNodeList of every input from every forms $inputs = $oXpath->query("//form//input"); // again , knowing the name attribute of the form is better, you could use: //$oXpath->query("//form[@name='form_name']//input"); // you would be sure to have the correct inputs in your list foreach ($inputs as $input) { //loop through inputs ... }
Это очень помогло бы, если форма, которую вы пытаетесь получить из данных, идентифицируется по атрибуту (имя, идентификатор) или окружена одним и тем же типом родительского узла (т. Е. Форма всегда находится в div с фиксированный id, …), ищите такой шаблон в своих источниках, и я мог бы дать вам правильное выражение Code / Xpath.
Вы можете использовать DOM, как указано katsuo11. Вот пример кода JS, который может вам помочь.
<script type="text/javascript"> function DisplayFormValues() { var str = ''; var elem = document.getElementById('frmMain').elements; for(var i = 0; i < elem.length; i++) { str += "<b>Type:</b>" + elem[i].type + "  "; str += "<b>Name:</b>" + elem[i].name + " "; str += "<b>Value:</b><i>" + elem[i].value + "</i> "; str += "<BR>"; } document.getElementById('lblValues').innerHTML = str; } </script>