[英]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"> </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. John Doe<br>
2. Jane Doe<br>
3. 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'
分別在他們。
關於我需要對我的代碼進行修改的任何建議?
感謝
另一種方法。
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"> </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. John Doe<br>
2. Jane Doe<br>
3. 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.