import requests
from bs4 import BeautifulSoup
from lxml import html
import csv
headers = {'user-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:72.0) Gecko/20100101 Firefox/72.0',
'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8'
}
url = 'https://opi.dfo.kz/p/ru/DfoObjects/objects/teaser-view/25720?RevisionId=0&ReportNodeId=2147483637&PluginId=6c2aa36248f44fd7ae888cb43817d49f&ReportId=61005620'
response = requests.get(url,headers=headers)
file = open('data.csv','w') # Открываем файл на запись. Можно было использовать контекстный менеджер, но так думаю проще.
writer = csv.writer(file) # Передаем в функцию writer дескриптор открытого файла.
soup = BeautifulSoup(response.text,"html.parser")
rows = soup.find('table',class_='dsnode-table').find('tbody').find_all('tr') # Ищем в html тег 'table' с классом 'dsnode-table',
# далее в найденом ищем тег 'tbody' и наконец ищем все теги 'tr'. Тег 'tr' в html это тег строки таблицы. В результате, в rows
# у нас окажутся все теги 'tr', тоесть все строки таблицы.
for row in rows: # Проходимся по всем строкам. При каждой итерации, в row у нас будет следующая строка таблицы, вместе с html тегами.
columns = row.find_all('td') # Ищем в текущей строке таблици все теги 'td'. В html td - это тег ячейки.
data_list = [columns[0].text,columns[1].text,columns[2].text,columns[3].text,columns[4].text,columns[5].text,columns[6].text,columns[7].text,columns[8].text]
# Так как в каждой строке 9 ячеек, а элементы списка в большинстве ЯП нумеруюются с нуля, то мы можем обратится к конкретной ячейке
# текущей строки по индексу. Первая ячейка будет columns[0], а последняя, тоесть девятая - columns[8]. Создаем список 'data_list',
# и заносим в него все ячейки текущей строки. Но, так как в columns кроме текстовых данных также присутствуют html теги, мы обращаемся
# к свойству .text, что-бы получить сам текст, без тегов.
writer.writerow(data_list) # Записываем текущую строку в csv файл.
# Далее цикл продолжается, пока не достигнет конца таблицы(условно, так как все строки таблици мы уже получили, и они хранятся в 'rows')
file.close() # Так как мы не используем контекстный менеджер with, обязательно закрываем открытый файл.