@ddgryaz

Как спарсить данные в одну таблицу? Или как объединить два словаря?

Доброго времени суток!
Подскажите пожалуйста, парсю данные, результатом должна быть таблица из двух колонок.
На моем опыте такое впервые, что я создаю два разных словаря в двух разных циклах, как здесь правильно поступить?

from bs4 import BeautifulSoup
import csv


def rename_uik_number(uik_bad_name):
    true_name = uik_bad_name.split(' ')[1:]
    true_name1 = ''.join(true_name)[1:]
    return true_name1


def rename_part(part_bad):
    true_val = part_bad.split('\n')[1]
    return true_val


def get_data():
    f = open('sites/1.html', 'r').read()
    soup = BeautifulSoup(f, 'lxml')
    body = soup.find('body')
    table = body.find('table', width="100%", cellpadding="0", height="80%").find('tbody')
    trs = table.find('tr', height="100%")
    table2 = trs.find('table', style="width:100%;border-color:#000000").find('tbody').find('tr', style="height:100%")
    table3 = table2.find('td', width="90%").find('div', style="width:100%; bgcolor:white;overflow:scroll").find(
        'table').find('tbody')
    ntr = table3.find('tr', valign="top")
    tds = ntr.find_all('td')
    for td in tds:
        uik_bad_name = td.find('nobr').find('a').text
        uik_name = rename_uik_number(uik_bad_name)
        # data = {'uik_name': uik_name}
        # write_csv(data)
    vtr = table3.find_all('tr')[18:]
    for vt in vtr:
        tds = vt.find_all('td')
        for td in tds:
            part_bad = td.text
            part = rename_part(part_bad)
            # data = {
            #     'part': part
            # }
            # write_csv(data)


def write_csv(data):
    with open('uiki.csv', 'a') as f:
        writer = csv.writer(f)
        writer.writerow([
            data['uik_name'],
            data['part'],
        ])


def main():
    get_data()


if __name__ == '__main__':
    main()


То есть, значение из первого словаря должно быть напротив значения из второго словаря в конечной таблице. Быть можно как то объединить два словаря?
  • Вопрос задан
  • 238 просмотров
Решения вопроса 1
hottabxp
@hottabxp Куратор тега Python
Сначала мы жили бедно, а потом нас обокрали..
Не знаю, разберетесь ли вы в коде, но как мог - комментировал:
from bs4 import BeautifulSoup
import csv

def parsing(filename):
	with open(filename,encoding='cp1251') as file:
		data = file.read()

	soup = BeautifulSoup(data,"lxml")
	table1 = soup.select_one("table[style='width:100%;border-color:#000000']").select("table")[0] # Выбираем таблицу 1
	table2 = soup.select_one("table[style='width:100%;border-color:#000000']").select("table")[1] # Выбираем таблицу 2

	list1 = [] # Здесь будет список строк из первой таблицы
	list2 = [] # Здесь будет список строк из второй таблицы

	dataFromTable1 = table1.find_all('tr') # Ищем все теги tr в первой таблице
	
	for data in dataFromTable1[1:]: # Начинаем перебор со второго элемента, чтобы пропустить заголовок таблицы
		try:
			datalist = [] # Список для временного хранения каждой строки таблицы
			id, text, summa = data.find_all('td')
			datalist.append(id.text)
			datalist.append(text.text)
			datalist.append(summa.text.strip())
			list1.append(datalist) # Добавляем в цикле в список list1 список строк
		except ValueError:
			#HACK Не добавляем в список пустые строки
			pass
	
	dataFromTable2 = table2.find_all('tr')
	for data in dataFromTable2[1:]:
		td_tags = data.find_all('td')
		try:
			datalist = [] # Список для временного хранения каждой строки таблицы
			for tag in td_tags:
				datalist.append(tag.text.strip())
			if len(datalist) > 9: # Чтобы пропустить пустую строку в таблице, добавляем в список list2 только список, в котором больше 9-ти элементов
				list2.append(datalist) # Добавляем в цикле в список list2 список строк
		except ValueError:
			pass

	new_list = [] # Здесь будет объединенный список из list1 и list2
	for e,x in enumerate(list1): # объединением списки
		x.extend(list2[e])
		new_list.append(x)


	with open('uiki.csv','a') as file:
		writer = csv.writer(file)
		writer.writerows(new_list)

parsing('index.html') # Имя файла(или полный путь)

В коде возможны ошибки, нарушен PEP8, но на часах уже почти час ночи, поэтому как так.
Результат:
5fcc0c553c148956612699.png
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы