Разбор таблицы в документе HTML в CSV с использованием Python 3.7 - PullRequest
1 голос
/ 06 мая 2020

У меня есть таблица ниже в документе html: -

<BODY>

<TABLE cellspacing=0 class="emlhdr"><TBODY><TR style="font-size: 1px"><TD style="border: none; padding: 0px">&nbsp;</TD></TR>
</TBODY></TABLE><!-- BEGIN_EXCLUDE_MORE_DATA -->
<TABLE cellspacing=1 class="ad"><TBODY>
<TR class="even"><TH class="adlbl10"><NOBR>Title: </NOBR></TH><TD>Sample Title</TD></TR>
<TR class="odd"><TH class="adlbl10"><NOBR>Site: </NOBR></TH><TD> Sample Site </TD></TR>
<TR class="even"><TH class="adlbl10"><NOBR>URLIcon: </NOBR></TH><TD><style type="text/css">
</style>
</TD></TR>
<TR class="odd"><TH class="adlbl10"><NOBR>URL: </NOBR></TH><TD><style type="text/css">
</style>
</TD></TR>
<TR class="even"><TH class="adlbl10"><NOBR>Form: </NOBR></TH><TD>HistoryListEntry</TD></TR>
<TR class="odd"><TH class="adlbl10"><NOBR>Collaborators: </NOBR></TH><TD>1.&nbsp;&nbsp;John Doe<br>
2.&nbsp;&nbsp;Jane Doe<br>
3.&nbsp;&nbsp;Jack Doe</TD></TR>
<TR class="even"><TH class="adlbl10"><NOBR>SourceForm: </NOBR></TH><TD>Reply</TD></TR>
<TR class="odd"><TH class="adlbl10"><NOBR>$UpdatedBy: </NOBR></TH><TD>John Doe</TD></TR>
<TR class="even"><TH class="adlbl10"><NOBR>$Revisions: </NOBR></TH><TD>2/24/2020 9:37:13 AM +0000</TD></TR>
</TBODY></TABLE><!-- END_EXCLUDE_MORE_DATA -->
</BODY>

Я пытаюсь проанализировать таблицу, чтобы различные записи go помещались в столбцы в .csv. Вот мой код Python 3.7 на данный момент: -

import os
from lxml import etree
from bs4 import BeautifulSoup
import csv

output_row = []

with open(x, 'r', encoding="ascii", errors="surrogateescape") as f:
    s = f.read()
    soup = BeautifulSoup(s, 'lxml') # Parse the HTML as a string
    table = soup.find_all('table')[1] # Grab the first table
    for table_row in table.findAll('tr'):
        columns = table_row.findAll('td')
        for column in columns:
            output_row.append(column.text)

with open('output.csv', 'w') as csvfile:
    writer = csv.writer(csvfile)
    for x in output_row:
        writer.writerows(x)

Кажется, он работает, находит и извлекает данные, но я не могу выровнять его по столбцам. Я бы хотел, чтобы каждое текстовое значение TR class было в новом столбце в .csv. Таким образом, в .csv будет 9 столбцов с

'Sample Title', 'Sample Site', '', '', 'HistoryListEntry', '1. John Doe 2. Jane Doe 3. Jack Doe', 'Reply', 'Joe Doe', '2/24/2020 9:37:13 AM +0000' 

соответственно.

Любые предложения по поправкам, которые мне нужны для моего кода?

С благодарностью

Ответы [ 2 ]

0 голосов
/ 14 июля 2020

Другой метод.

from simplified_scrapy import SimplifiedDoc, utils, req
html = '''<BODY>
<TABLE cellspacing=0 class="emlhdr"><TBODY><TR style="font-size: 1px"><TD style="border: none; padding: 0px">&nbsp;</TD></TR>
</TBODY></TABLE><!-- BEGIN_EXCLUDE_MORE_DATA -->
<TABLE cellspacing=1 class="ad"><TBODY>
<TR class="even"><TH class="adlbl10"><NOBR>Title: </NOBR></TH><TD>Sample Title</TD></TR>
<TR class="odd"><TH class="adlbl10"><NOBR>Site: </NOBR></TH><TD> Sample Site </TD></TR>
<TR class="even"><TH class="adlbl10"><NOBR>URLIcon: </NOBR></TH><TD><style type="text/css">
</style>
</TD></TR>
<TR class="odd"><TH class="adlbl10"><NOBR>URL: </NOBR></TH><TD><style type="text/css">
</style>
</TD></TR>
<TR class="even"><TH class="adlbl10"><NOBR>Form: </NOBR></TH><TD>HistoryListEntry</TD></TR>
<TR class="odd"><TH class="adlbl10"><NOBR>Collaborators: </NOBR></TH><TD>1.&nbsp;&nbsp;John Doe<br>
2.&nbsp;&nbsp;Jane Doe<br>
3.&nbsp;&nbsp;Jack Doe</TD></TR>
<TR class="even"><TH class="adlbl10"><NOBR>SourceForm: </NOBR></TH><TD>Reply</TD></TR>
<TR class="odd"><TH class="adlbl10"><NOBR>$UpdatedBy: </NOBR></TH><TD>John Doe</TD></TR>
<TR class="even"><TH class="adlbl10"><NOBR>$Revisions: </NOBR></TH><TD>2/24/2020 9:37:13 AM +0000</TD></TR>
</TBODY></TABLE><!-- END_EXCLUDE_MORE_DATA -->
</BODY>'''

doc = SimplifiedDoc(html)
# header = doc.selects('TABLE.ad>TR').select("TH>text()")
data = doc.selects('TABLE.ad>TR').select("TD>text()")
utils.save2csv('output.csv',[data])
print (data)

Результат:

['Sample Title', 'Sample Site', '', '', 'HistoryListEntry', '1. John Doe 2. Jane Doe 3. Jack Doe', 'Reply', 'John Doe', '2/24/2020 9:37:13 AM +0000']

Вот еще примеры: https://github.com/yiyedata/simplified-scrapy-demo/tree/master/doc_examples

0 голосов
/ 06 мая 2020

Ваш output_row, кажется, представляет собой одну строку, поэтому вам просто нужно записать эту строку в ваш файл csv (используя writerow и без for l oop):

with open('output.csv', 'w') as csvfile:
    writer = csv.writer(csvfile, delimiter=',', quotechar="'", quoting=csv.QUOTE_ALL)
    writer.writerow(output_row)

Для обработки нескольких записей данных вам понадобится список списков и итерация по внешнему списку (см. Также это обсуждение ).

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

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