簡體   English   中英

使用 Python 3.7 將 HTML 文檔中的表解析為 csv

[英]Parsing a table in a HTML document into a csv using Python 3.7

我在 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 放入 a.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 類”文本值都在.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' 

分別在他們。

關於我需要對我的代碼進行修改的任何建議?

感謝

您的output_row似乎代表單行,因此您只需將此行寫入 csv 文件(使用writerow且不使用for循環):

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

為了處理多個數據記錄,您將需要一個列表列表並遍歷外部列表(另請參閱此討論)。

還要注意數據字段中的換行符,您可能應該替換它們以獲得正確的結果。

另一種方法。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM