2

あなたにとって小さな問題:-)

私はBeautifulSoupを使用してHTMLページのテーブルのコンテンツを解析しています。問題は、出力ファイルのすべての行(CSV / EXCEL)の間に、空白行が表示されることです...これはHTMLテーブル(非常に大きい)の例です。

<tr><td class="normaltext" valign="TOP">Tesco - United Kingdom&nbsp;&nbsp;</td>
<td class="normaltext"  valign="TOP">CO</td>
<td class="normaltext"  valign="TOP">Unknown&nbsp;&nbsp;</td>
<td class="normaltext"  align="center" valign="top">lol</td></tr>
<tr><td colspan="5"><hr></td></tr>
<tr><td class="normaltext" valign="TOP">Tesco - United Kingdom&nbsp;&nbsp;</td>
<td class="normaltext"  valign="TOP">CO</td>
<td class="normaltext"  valign="TOP">Unknown&nbsp;&nbsp;</td>
<td class="normaltext"  align="center" valign="top">lol</td></tr>
<tr><td colspan="5"><hr></td></tr>

すべての<tr>には次のようなものがあります:<tr> <td colspan = "5"> <hr> </ td> </ tr>つまり、CSV/Excelシートに空白行が追加されます。すべての情報をExcelシートに取り込みたいのですが、すべての行の間に空白行がありません...

これが私が使用するスクリプトです:

rows = tableau[3].findAll('tr')
for tr in rows:
    cols = tr.findAll('td', attrs={'class' : 'normaltext'})
    y = 0
    x = x + 1
    for td in cols:
        texte_bu = td.text
        texte_bu = texte_bu.encode('utf-8')
        texte_bu = texte_bu.strip()
        ws.write(x,y,td.text)
        y = y + 1

私の出力ファイルのすべての行の間にこの*空白の役に立たない行のリブを取得するためのヒントを私に与えることができる人に大いに感謝します:)

4

1 に答える 1

1

解決策:空の行を見つけたら、ループをスキップして次の行を読み取ります。これにより、ブックに空の行を書き込む必要がなくなります。:)

これは実用的なシミュレーションです。一番上の空の行が送信されないようにするために、外観上の調整を追加しました。これが空行の厄介さを取り除くことを願っています:)

from BeautifulSoup import BeautifulSoup
import xlwt

text = '''<table><tr><td class="normaltext" valign="TOP">Tesco - United Kingdom&nbsp;&nbsp;</td>
<td class="normaltext"  valign="TOP">CO</td>
<td class="normaltext"  valign="TOP">Unknown&nbsp;&nbsp;</td>
<td class="normaltext"  align="center" valign="top">BULATS</td></tr>
<tr><td colspan="5"><hr></td></tr>
<tr><td class="normaltext" valign="TOP">Tesco - United Kingdom&nbsp;&nbsp;</td>
<td class="normaltext"  valign="TOP">CO</td>
<td class="normaltext"  valign="TOP">Unknown&nbsp;&nbsp;</td>
<td class="normaltext"  align="center" valign="top">BULATS</td></tr>
<tr><td colspan="5"><hr></td></tr><table>'''

wb = xlwt.Workbook()
ws = wb.add_sheet('a test sheet')

soup = BeautifulSoup(text)
table = soup.find('table')
rows = table.findAll('tr')
x = 0
for tr in rows:
    cols = tr.findAll('td', attrs={'class' : 'normaltext'})
    if not cols: 
        # when we hit an empty row, we should not print anything to the workbook
        continue
    y = 0
    for td in cols:
        texte_bu = td.text
        texte_bu = texte_bu.encode('utf-8')
        texte_bu = texte_bu.strip()
        ws.write(x, y, td.text)
        print(x, y, td.text)
        y = y + 1
    # update the row pointer AFTER a row has been printed
    # this avoids the blank row at the top of your table
    x = x + 1

wb.save('example.xls')
于 2012-05-01T19:57:50.477 に答える