ошибка типа python: объект ‘int’ не может быть итерирован в библиотеке beautifulsoup

#python #beautifulsoup #python-requests

#python #beautifulsoup #python-запросы

Вопрос:

Существует сайт под названием dnsdumpster, который предоставляет все поддомены для домена. Я пытаюсь автоматизировать этот процесс и распечатать список поддоменов. Каждый отдельный поддомен находится в HTML-теге «td». Я пытаюсь перебрать все эти теги и распечатать поддомены, но получаю сообщение об ошибке.

 import requests
import re
from bs4 import BeautifulSoup

headers = {
    'Host' : 'dnsdumpster.com',
    'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:80.0) Gecko/20100101 Firefox/80.0',
    'Accept' : 'text/html,application/xhtml xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
    'Accept-Language' : 'en-US,en;q=0.5',
    'Accept-Encoding' : 'gzip, deflate',
    'DNT' : '1',
    'Upgrade-Insecure-Requests' : '1',
    'Referer' : 'https://dnsdumpster.com/',
    'Connection' : 'close'
}

proxies = {
    'http' : 'http://127.0.0.1:8080'
}

domain = 'google.com'

with requests.Session() as s:
    url = 'https://dnsdumpster.com'
    response = s.get(url, headers=headers, proxies=proxies)
    response.encoding = 'utf-8' # Optional: requests infers this internally
    soup1 = BeautifulSoup(response.text, 'html.parser')
    input = soup1.find_all('input')
    csrfmiddlewaretoken_raw = str(input[0])
    csrfmiddlewaretoken = csrfmiddlewaretoken_raw[55:119]
    data = {
        'csrfmiddlewaretoken' : csrfmiddlewaretoken,
        'targetip' : domain
    }
    send_data = s.post(url, data=data, proxies=proxies, headers=headers)
    print(send_data.status_code)
    soup2 = BeautifulSoup(send_data.text, 'html.parser')
    td = soup2.find_all('td')
    for i in len(td):
        item = str(td[i])
        subdomain = item[21:37]
        print(subdomain)
 

Ошибка выглядит следующим образом:

Трассировка (последний последний вызов): файл «dns_dumpster_4.py «, строка 39, в для i в len (td): TypeError: объект ‘int’ не является итеративным

И как только вышеуказанная ошибка будет устранена, мне также понадобится помощь с другим вопросом: как я могу использовать регулярное выражение для получения отдельного поддомена из этого тега «td», потому что содержимое этого тега очень длинное и запутанное, и мне нужен только поддомен. Я был бы очень признателен, если бы кто-нибудь мог помочь мне с простым получением только имени поддомена.

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

1.len() получит длину; возвращаемое значение является целым числом, которое вы не можете повторить. Избавьтесь от len() for i in td

2. Вы не можете выполнять итерацию по целому числу, используйте for i in range(0,len(td)): для итерации от 0 до длины объекта td .

3. Вам нужно использовать его как for i in range(len(td))

Ответ №1:

Я пытаюсь перехватить поддомен без использования регулярных выражений.

 import requests
from bs4 import BeautifulSoup

headers = {
    'Host' : 'dnsdumpster.com',
    'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:80.0) Gecko/20100101 Firefox/80.0',
    'Accept' : 'text/html,application/xhtml xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
    'Accept-Language' : 'en-US,en;q=0.5',
    'Accept-Encoding' : 'gzip, deflate',
    'DNT' : '1',
    'Upgrade-Insecure-Requests' : '1',
    'Referer' : 'https://dnsdumpster.com/',
    'Connection' : 'close'
}

proxies = {
    'http' : 'http://127.0.0.1:8080'
}

domain = 'google.com'

with requests.Session() as s:
    url = 'https://dnsdumpster.com'
    response = s.get(url, headers=headers, proxies=proxies)
    response.encoding = 'utf-8' # Optional: requests infers this internally
    soup1 = BeautifulSoup(response.text, 'html.parser')
    input = soup1.find_all('input')
    csrfmiddlewaretoken_raw = str(input[0])
    csrfmiddlewaretoken = csrfmiddlewaretoken_raw[55:119]
    data = {
        'csrfmiddlewaretoken' : csrfmiddlewaretoken,
        'targetip' : domain
    }
    send_data = s.post(url, data=data, proxies=proxies, headers=headers)
    print(send_data.status_code)
    soup2 = BeautifulSoup(send_data.text, 'html.parser')
    td = soup2.find_all('td', {'class': 'col-md-3'})
    # for dom in range(0, len(td),2):
    #     print(td[dom].get_text(strip=True, separator='n'))

    mysubdomain = []
    for dom in range( len(td)):
        # print(td[dom].get_text(strip=True, separator='n'))
        if '.' in td[dom].get_text(strip=True):
            x = td[dom].get_text(strip=True, separator=',').split(',')
            mysubdomain.append(x)
            # print(x)
            # y = td[dom].get_text(strip=True, separator=',').split(',')[1]
           
            # mysubdomain.append(td[dom].get_text(strip=True, separator=','))
    print(mysubdomain)
    # print(td)

    # for i in range(len(td)):
        # item = str(td[i])
        # print('n', item, 'n')
        # subdomain = item[21:37]
        # print(subdomain)
from functools import reduce
flat_list_of_mysubdomain = reduce(lambda x, y: x   y, mysubdomain)
print(flat_list_of_mysubdomain)
 

Я надеюсь, что это поможет вам.