В чем причина некорректной работы написанного на Python кода?

Как можно преодолеть ограничение с парсингом только первой страницы списка IP-адресов игровых серверов с сайта https://cs-ms-monitoring.ru/all-servers/? Хочу записать все IP-адреса в файл на компьютере. Вот ссылка на мой текущий код: https://pastebin.com/Dq8ArMMK.
  • 14 августа 2024 г. 10:53
Ответы на вопрос 3
Одной из причин некорректной работы кода может быть то, что он парсит только первую страницу списка IP-адресов. Для того чтобы преодолеть это ограничение, можно использовать библиотеку requests для получения содержимого нескольких страниц сайта, а затем парсить IP-адреса со всех страниц.

Вот как можно модифицировать код:

```python
import requests
from bs4 import BeautifulSoup

base_url = "https://cs-ms-monitoring.ru/all-servers/?"
page = 1

while True:
    url = base_url + "page=" + str(page)
    response = requests.get(url)
    soup = BeautifulSoup(response.content, "html.parser")
    
    ips = soup.find_all("span", class_="shortIP")
    if not ips:
        break
    
    with open("ips.txt", "a") as file:
        for ip in ips:
            file.write(ip.text + "\n")
    
    page += 1
```

Этот код будет парсить IP-адреса со всех страниц списка и записывать их в файл "ips.txt" на компьютере.
парсит только первую страницу
Наверное, не первую, а последнюю? У вас на каждую итерацию while массив найденных элементов затирается и используется потом только данные последней страницы.

Отступы у for i in root: нужно поправить - эта логика должна выполняться внутри цикла while .
А tage = [] нужно из цикла, наоборот, вынести. Ну а лучше вообще эту переменную убрать и писать в файл прямо внутри while .
Знаю, что быдло код, просьба не критиковать , так как я только учась! :)

А как Вы научитесь, если Вас не будут критиковать?
Почему не парсит остальные страницы?

Вас не смущает, что root находится в другой области видимости?
while cout_page < 8:
  # ...
  root = soup.findAll('span',{'class':'label label-default'})

for i in root:
  tage.append(i.text)

Вот так работает:
import requests
from bs4 import BeautifulSoup

start_page = 1
last_pages = 8

tags = []

for page in range(start_page, last_pages + 1):
    url = f"https://cs-ms-monitoring.ru/all-servers/page/{page}/"
    res = requests.get(url)

    if res.status_code == 200:
        soup = BeautifulSoup(res.text, "lxml")
        root = soup.find_all('span', {'class': 'label label-default'})
        tags.extend([tag.text for tag in root])
    else:
        print(f"Ошибка на странице {page}")

with open("base.txt", "w") as file:
    for tag in tags:
        file.write(tag + "\n")

Похожие вопросы