удалить скрытые строки в коде html, используя bs4 и python - PullRequest
1 голос
/ 08 июля 2020

Я пытаюсь удалить строки type = "hidden" из html кода, который я вытащил через python. причина этого в том, что я извлекаю данные тега формы из кода html, чтобы создать словарь, например: {"username": "", "password": "", "Login": "submit"}, однако, потому что beautifulsoup извлекает все, что есть в строках type = "hidden", а мой словарь выглядит довольно нелепо и, очевидно, совершенно непригодным для использования. вот код:

#!/usr/bin/env python

import requests
from bs4 import BeautifulSoup
from urllib.parse import urljoin, urlparse
import re

target_url = "https://example.com"


def request(url):
    try:
        return requests.get(url)
    except requests.exceptions.ConnectionError:
        pass


response = request(target_url)
parsed_html = BeautifulSoup(response.content, 'html.parser')
forms_list = parsed_html.find("form")
for hidden in forms_list.body.findAll(re.findall('(?:<input ")(.*?)>')):
    hidden.decompose()


for form in modified_form:
    action = form.get("action")
    post_url = urljoin(target_url, action)
    method = form.get("method")

    inputs_list = form.findAll("input")
    post_data = {}
    for input in inputs_list:
        input_name = input.get("name")
        input_type = input.get("type")
        input_value = input.get("value")
        post_data[input_name] = input_type
    result = requests.post(post_url, data=post_data)
    print(post_data)

Я получаю это сообщение об ошибке: Traceback (последний вызов последним): файл «form.py», строка 21, для скрытого в forms_list.body.findAll (re. найти все('(?: ')): AttributeError: объект' NoneType 'не имеет атрибута' body '

Я новичок в этом, поэтому извиняюсь, если мой код ужасен. как мне удалить только строки type = "hidden" из кода html, проанализированного с помощью beautifulsoup?

1 Ответ

0 голосов
/ 08 июля 2020

Теги удалять не нужно, просто выберите все теги <input>, которые не содержат атрибут type="hidden" (например, с помощью селектора CSS input:not([type="hidden"])):

from bs4 import BeautifulSoup

html = '''
    <form action="/some_action" method="get">
        <input type="hidden" name="name1" value="value1" />

        <input type="text" id="u" name="username" value="username" />
        <input type="text" id="p" name="password" value="password" />
        <input type="submit" value="Submit">
   </form>
'''

soup = BeautifulSoup(html, 'html.parser')

for i in soup.form.select('input:not([type="hidden"])'):
    print(i.get('name'), i.get('type'), i.get('value'))

Печать:

username text username
password text password
None submit Submit
...