Извлечение из нескольких html-файлов (данных одного типа) и сохранение результатов в одном кадре данных - PullRequest
0 голосов
/ 19 ноября 2018

Я хочу извлечь конкретные данные из нескольких файлов HTML (имеющих одинаковое расположение) и сохранить их в одном кадре данных. Сценарий, который я написал (см. Ниже), извлекает информацию только из последнего файла в папке.

import pandas as pd
from bs4 import BeautifulSoup
import glob
import os.path
counter = 0


dir_path = r"/home"    


for file_name in glob.glob(os.path.join(dir_path, "*.html")):
    with open(file_name) as html_file:
        soup = BeautifulSoup(html_file)
        counter = counter+1

        text = []
        vessel_name = []
        port = []
        voy_no = []

        for p_tag in soup.find_all('p', {'class' : 'MsoNormal'}):
            text.append(p_tag.text)

        text1 = [el.replace('\xa0',' ') for el in text]

        a = text1[2].split(":")[1]
        vessel_name.append((list(a.split())))

        b = text1[4].split(":")[1]
        voy_no.append((b.split()))

        c = text1[5].split(":")[1]
        port.append((c.split()))

        dict_for_df = {'Vessel_Name':vessel_name, 'Voy_No':voy_no, 'Port':port}

    final_df = pd.DataFrame.append(dict_for_df)

1 Ответ

0 голосов
/ 19 ноября 2018

Чтобы все заработало, создайте в начале emtpy-фрейм данных

final_df = pd.DataFrame()

и добавьте к нему позже

final_df = final_df.append(dict_for_df)

Полный код:

import pandas as pd
from bs4 import BeautifulSoup
import glob
import os.path
counter = 0

final_df = pd.DataFrame()

dir_path = r"/home"    

for file_name in glob.glob(os.path.join(dir_path, "*.html")):
    with open(file_name) as html_file:
        soup = BeautifulSoup(html_file)
        counter = counter+1

        text = []
        vessel_name = []
        port = []
        voy_no = []

        for p_tag in soup.find_all('p', {'class' : 'MsoNormal'}):
            text.append(p_tag.text)

        text1 = [el.replace('\xa0',' ') for el in text]

        a = text1[2].split(":")[1]
        vessel_name.append((list(a.split())))

        b = text1[4].split(":")[1]
        voy_no.append((b.split()))

        c = text1[5].split(":")[1]
        port.append((c.split()))

        dict_for_df = {'Vessel_Name':vessel_name, 'Voy_No':voy_no, 'Port':port}

        final_df = final_df.append(dict_for_df)

Обратите внимание, что это не лучший способ сделать это.Если ваши данные помещаются в память, лучше собрать все данные в список каталогов и создать кадр данных в конце.Для небольшого набора данных из 1000 строк или меньше этого должно быть достаточно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...