Форум сайта python.su
С помощью BeautifulSoup нужно обработать все файлы из папки и подпапок
Результат нужно вынести в один файл (csv) разделенный запятыми в строчку
Написал скрипт. Он обрабатывает только один файл. В документации не нашел решения
[code python]
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Sat Mar 10 16:41:57 2018
@author: InterNet
"""
from bs4 import BeautifulSoup
import requests, urllib, csv, re, sys
def main():
html = open('scrap.html', encoding="windows-1251").read()
soup = BeautifulSoup(html, 'lxml')
name = soup.find(itemprop="name").get_text()
print(name)
address = soup.find(itemprop="address").get_text()
print(address)
telephone = soup.find(itemprop="telephone").get_text()
print(telephone)
email = soup.find('div', class_='spFPMail').get_text()
print(email)
descr = soup.find('div', class_='spFPDescr').get_text()
print(descr)
if __name__ == '__main__':
main()
[/code]
Офлайн
Сформировать csv получилось
#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ Created on Sat Mar 10 16:41:57 2018 @author: InterNet """ from bs4 import BeautifulSoup import requests, urllib, csv, re, sys #csvfile = open('test.csv', 'w', encoding='cp850', errors='replace') writer = csv.writer(csvfile) def main(): html = open('scrap.html', encoding="windows-1251").read() soup = BeautifulSoup(html, 'lxml') name = soup.find(itemprop="name").get_text() #print(name) address = soup.find(itemprop="address").get_text() #print(address) telephone = soup.find(itemprop="telephone").get_text() #print(telephone) email = soup.find('div', class_='spFPMail').get_text() #print(email) descr = soup.find('div', class_='spFPDescr').get_text() #print(descr) data = { name, #'address': address, #'telephone': telephone, #'email': email, #'descr': descr } writer = csv.writer( open( 'test_10k.csv', 'a', newline='', encoding='UTF-8', errors='replace' ) ) writer.writerow(data) csvfile.flush() if __name__ == '__main__': main()
Отредактировано KasFun (Март 11, 2018 10:50:01)
Офлайн
вывести список файлов из папки можно кодом
import os for root, dirs, files in os.walk("/home/user/wget/"): for file in files: if file.endswith(".html"): print(os.path.join(root, file))
Отредактировано KasFun (Март 11, 2018 17:11:33)
Офлайн
Что ты прицепился к этой функции main()? В main() у тебя должен быть только один вызов - process_files(dir, ext, outfile). Дальше в process_files() пишешь и поиск файлов по расширениям, и вызов функции обработки одного файла, и сохранение результатов в общий csv-файл.
Пиши по методу разработки “сверху вниз”: сначала пишешь вызовы функций, как будто они уже написаны, делаешь заглушки для них, якобы эти функции работают, а потом дописываешь тела функций, когда всё правильно работает на макетах функций.
def main(): process_files('/path/dir', 'html', 'output.csv') def process_files(searchdir, filesext, outfile): print('process_files():', searchdir, filesext, outfile) if __name__ == '__main__': main()
def main(): process_files('/path/dir', 'html', 'output.csv') def process_files(searchdir, filesext, outfile): csvout = open_csv_file(outfile) files = get_files(searchdir, filesext) for fname in files: parsed_data = parse_file(fname) csv_formed_data = form_for_csv_file(parsed_data) append_to_csv_file(csvout, csv_formed_data) close_csv_file(csvout) def open_csv_file(ifname): print('open_csv_file()', ifname) return '<opened csv file>' def get_files(idir, fext): print('get_files():', idir, fext) return ['file1.html', 'file2.html'] def parse_file(ifname): print('parse_file():', ifname) return [('node a', 'node b', 'node c'), ('node d', 'node e', 'node f')] def form_for_csv_file(data): print('form_for_csv_file()', data) return [['a', 'b', 'c'], ['d', 'e', 'f']] def append_to_csv_file(ofp, data): print('append_to_csv_file()', ofp, data) def close_csv_file(ifp): print('close_csv_file()', ifp) if __name__ == '__main__': main()
Отредактировано py.user.next (Сен. 4, 2018 12:30:20)
Офлайн
Друзья! Третий день бьюсь. Пробовал с glob и os
помогите сделать так, чтобы поиск был не по файлу
html = open('scrap.html', encoding="windows-1251").read()
Офлайн
Спасибо. Мне помогли на киберфоруме
def main(): for path, dirlist, filelist in os.walk(r'/home/user/Загрузки/wget'): # Здесь указываете путь к верхнему каталогу for file_name in filelist: if file_name.endswith('.html'): with open(os.path.join(path, file_name), encoding="windows-1251") as file: html = file.read()
Отредактировано KasFun (Март 13, 2018 19:35:29)
Офлайн