Как разобрать HTML-файл в формате .TXT (без вкладок) в Python? - PullRequest
0 голосов
/ 05 апреля 2019

Я столкнулся с проблемой в моем программировании, которая поставила меня в тупик.

Я пытаюсь получить доступ к данным, хранящимся во множестве старых файлов в формате HTML, сохраненных в виде текста. Однако при сохранении HTML-кода теряются его отступы, вкладки, иерархия, как бы вы это ни называли. Пример этого можно найти ниже.

......

<tr class="ro">
<td class="pl " style="border-bottom: 0px;" valign="top"><a class="a" href="javascript:void(0);" onclick="top.Show.showAR( this, 'defref_us-gaap_RevenueFromContractWithCustomerExcludingAssessedTax', window );">Net sales</a></td>
<td class="nump">$ 123,897<span></span>
</td>
<td class="nump">$ 122,136<span></span>
</td>
<td class="nump">$ 372,586<span></span>
</td>
<td class="nump">$ 360,611<span></span>
</td>
</tr>
<tr class="re">
<td class="pl " style="border-bottom: 0px;" valign="top"><a class="a" href="javascript:void(0);" onclick="top.Show.showAR( this, 'defref_us-gaap_OtherIncome', window );">Membership and other income</a></td>
<td class="nump">997<span></span>
</td>
<td class="nump">1,043<span></span>
</td>
<td class="nump">3,026<span></span>
</td>
<td class="nump">3,465<span></span>
</td>
</tr>
<tr class="rou">
<td class="pl " style="border-bottom: 0px;" valign="top"><a class="a" href="javascript:void(0);" onclick="top.Show.showAR( this, 'defref_us-gaap_Revenues', window );">Total revenues</a></td>
<td class="nump">124,894<span></span>
</td>
<td class="nump">123,179<span></span>
</td>
<td class="nump">375,612<span></span>
</td>
<td class="nump">364,076<span></span>
</td>
</tr>

Обычно я бы использовал здесь Beautiful Soup и приступил к разбору данных таким образом, но я не нашел хорошего рабочего процесса, поскольку технически здесь нет иерархии; Я не могу сказать BS, чтобы он смотрел на что-то другое, кроме самого документа, который огромен и может занимать слишком много времени (см. Следующее утверждение).

Мне также нужно найти исчерпывающее решение, а не быстрое решение, потому что у меня есть сотни, если не тысячи, тех же самых HTML-текстовых файлов для анализа.

Итак, мой вопрос здесь, если я хочу вернуть во всех файлах первое число «Членство и другие доходы» (в данном случае 997), как я могу это сделать?

Два файла с примерами можно найти здесь:

(https://www.sec.gov/Archives/edgar/data/1800/0001104659-18-065076.txt) (https://www.sec.gov/Archives/edgar/data/1084869/0001437749-18-020205.txt)


РЕДАКТИРОВАТЬ - 4/16

Спасибо всем за ответы! Я написал код, который возвращает теги, которые я ищу.

import requests
from bs4 import BeautifulSoup

data = requests.get('https://www.sec.gov/Archives/edgar/data/320193/0000320193-18-000070.txt')

# load the data
soup = BeautifulSoup(data.text, 'html.parser')

# get the data
for tr in soup.find_all('tr', {'class':['rou','ro','re','reu']}):
    db = [td.text.strip() for td in tr.find_all('td')]
    print(db)

Проблема в том, что существует тонна возвратов, и большинство из них не содержит ничего полезного Есть ли способ фильтрации на основе прародителя этих тегов? Я попробовал тот же подход, что и выше, используя заголовок, заголовок, тело и т. Д., Но я не могу получить BS для идентификации FILENAME ..

<DOCUMENT>
<TYPE>XML
<SEQUENCE>14
**<FILENAME>R2.htm**
<DESCRIPTION>IDEA: XBRL DOCUMENT
<TEXT>
<html>
<head>
<title></title>
.....removed for brevity
</head>
<body>
.....removed for brevity
<td class="text">&#160;<span></span>
</td>
.....removed for brevity
</tr>

1 Ответ

1 голос
/ 05 апреля 2019

Только чтобы вы знали, HTML не заботится об отступах. Если вы действительно хотите, все может быть на одной линии без пробелов между ними. Анализатор HTML будет просто смотреть на структуру тегов.

from bs4 import BeautifulSoup
soup = BeautifulSoup(html_doc, 'html.parser')
soup.find_all['<tag you are looking for>'][0]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...