Проблема при извлечении данных с помощью Beautifulsoup - PullRequest
0 голосов
/ 28 февраля 2020

Моя цель - преобразовать файл xls в файл xlsx. Файл xls, который я пытаюсь преобразовать, на самом деле является html файлом, содержащим таблицы (этот файл xls получен в результате запроса от jira). Чтобы облегчить преобразование, я создал обработчик файла, а затем передал этот обработчик файла в красивый суп и извлек интересующую таблицу, а эта извлеченная таблица преобразована в строку и передана в pandas фрейм данных для дальнейшей обработки.

Это прекрасно работает, но когда размер файла велик, скажем, около 80 МБ, обработка занимает много времени. Как мне это преодолеть?

    import bs4, os
    import pandas as pd


    print('Begin')
    fileName = 'TestSample.xls'
    fileHandler=open(fileName, encoding='utf-8')
    soup = bs4.BeautifulSoup(fileHandler,'html.parser')
    tbl = soup.find_all('table', id='issuetable')
    df=pd.read_html(str(tbl))
    df[0].to_excel("restult.xlsx", index=False)
    print('Completed')

1 Ответ

0 голосов
/ 28 февраля 2020

Хороших способов для больших файлов не существует, но вы можете попробовать другие способы.

from simplified_scrapy import SimplifiedDoc
print('Begin')
fileName = 'TestSample.xls'
html=open(fileName, encoding='utf-8').read()
doc = SimplifiedDoc(html)
start = 0 # If a string can uniquely mark the starting position of data, the performance will be better
tbl = doc.getElement('table', attr='id',value='issuetable', start=start)
print(tbl.outerHtml)

Или чтение блока

f=open(fileName, encoding='utf-8')
html = ''
start = '' # Start of block
end = '' # End of block
for line in f.readlines():
    if not html:
        html+=line
        if line.find(end)>=0:
            break
    elif line.find(start)>=0:
        html = line
        if line.find(end)>=0:
            break
doc = SimplifiedDoc(html)
tbl = doc.getElement('table', attr='id',value='issuetable')
print(tbl.outerHtml)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...