Найти - Пользователи
Полная версия: BeautifulSoup все файлы из папки и подпапок
Начало » Data Mining » BeautifulSoup все файлы из папки и подпапок
1
KasFun
С помощью 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]

Подскажите пожалуйста, как
1. Искать во всех файлах (html) папки и подпапках
2. Сохранить результат в csv
KasFun
Сформировать 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
вывести список файлов из папки можно кодом

 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))

теперь нужно проверить все найденные файлы

На заметку, хороший урок по walk
py.user.next
Что ты прицепился к этой функции 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()
И так пишешь функцию за функцией, спускаясь всё ниже и ниже, пока не дойдёшь до самого дна программы. Там оно всегда наступает в итоге.

На следующем шаге пишешь тело функции process_files() и делаешь заглушки для функций
  
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()
Всё это можно запускать и отлаживать, пока оно не станет правильным.
Дальше продолжаешь каждую функцию дописывать и отлаживать, заменяя заглушки на реальные функции.


tags: developing method from up to down
KasFun
Друзья! Третий день бьюсь. Пробовал с glob и os
помогите сделать так, чтобы поиск был не по файлу

 html = open('scrap.html', encoding="windows-1251").read()

а по всем файла *.html в папке + подпапки
KasFun
Спасибо. Мне помогли на киберфоруме

 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()
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB