Python & BS4: исключить пустую строку и итоговую строку

Ниже приведен мой код для извлечения данных из документа HTML и помещения его в переменные. Мне нужно исключить пустые строки, а также строку "итогового итога". Я добавил HTML-ввод этих сегментов под мой код. Я не уверен, как заставить это работать. Я не могу использовать len() потому что длина является переменной. Любая помощь?

from bs4 import BeautifulSoup
import urllib
import re
import HTMLParser
html = urllib.urlopen('RanpakAllocations.html').read()
parser = HTMLParser.HTMLParser()
#unescape doesn't seem to work
output = parser.unescape(html)

soup1 = BeautifulSoup(output, "html.parser")
Customer_No = []
Serial_No = []
data = []
#for hit in soup.findAll(attrs={'class' : 'MYCLASS'}):
rows = soup1.find_all("tr")
title = rows[0]
headers = rows[1]
datarows = rows[2:]

fields = []

try :
    for row in datarows :
        find_data = row.find_all(attrs={'face' : 'Arial,Helvetica,sans-serif'})
        count = 0
        for hit in find_data:
            data = hit.text
            count = count + 1
            if count == 3 :
                CSNO = data
            if count == 9 :
                ITNO = data
            else :
                continue

        print CSNO, ITNO
        print "new row"
except:
    pass

Вот вход. Первый <tr> моя последняя строка данных, однако мой цикл повторяется для пустых строк и итоговой строки под ним.

<tr>
        <td nowrap="nowrap" align="left"><font size="3" face="Arial,Helvetica,sans-serif">12</font></td>
        <td nowrap="nowrap" align="left"><font size="3" face="Arial,Helvetica,sans-serif">F5684</font></td>
        <td nowrap="nowrap" align="left"><font size="3" face="Arial,Helvetica,sans-serif">20182</font></td>
        <td nowrap="nowrap" align="left"><font size="3" face="Arial,Helvetica,sans-serif">VELOCITY SOLUTIONS INC.</font></td>
        <td nowrap="nowrap" align="left"><font size="3" face="Arial,Helvetica,sans-serif">EQPRAN77717</font></td>
        <td nowrap="nowrap" align="left"><font size="3" face="Arial,Helvetica,sans-serif">RANPAK FILLPAK TT 2</font></td>
        <td nowrap="nowrap" align="left"><font size="3" face="Arial,Helvetica,sans-serif">W/UNIVERSAL STAND S/N 51345563</font></td>
        <td nowrap="nowrap" align="right"><font size="3" face="Arial,Helvetica,sans-serif">1</font></td>
        <td nowrap="nowrap" align="left"><font size="3" face="Arial,Helvetica,sans-serif">51345563</font></td>
      </tr>
      <tr>
        <td nowrap="nowrap" align="left"><font size="1">&nbsp;</font></td>
        <td nowrap="nowrap" align="left"><font size="1">&nbsp;</font></td>
        <td nowrap="nowrap" align="left"><font size="1">&nbsp;</font></td>
        <td nowrap="nowrap" align="left"><font size="1">&nbsp;</font></td>
        <td align="left" colspan="5"><font size="1">&nbsp;</font></td>
      </tr>
      <tr>
        <td align="left"><font size="3" face="Arial,Helvetica,sans-serif">&nbsp;</font></td>
        <td align="left"><font size="3" face="Arial,Helvetica,sans-serif">Grand Total</font></td>
        <td align="left" colspan="7"><font size="1">&nbsp;</font></td>
      </tr>
      <tr>
        <td>&nbsp;</td>
        <td>&nbsp;</td>
        <td>&nbsp;</td>
        <td>&nbsp;</td>
        <td>&nbsp;</td>
        <td>&nbsp;</td>
        <td>&nbsp;</td>
        <td>&nbsp;</td>
        <td>&nbsp;</td>
      </tr> 

1 ответ

Решение

Я бы сделал что-то вроде этого:

from bs4 import BeautifulSoup

content = '''
<root>
    <tr>
        <td nowrap="nowrap" align="left"><font size="3" face="Arial,Helvetica,sans-serif">12</font></td>
        <td nowrap="nowrap" align="left"><font size="3" face="Arial,Helvetica,sans-serif">F5684</font></td>
        <td nowrap="nowrap" align="left"><font size="3" face="Arial,Helvetica,sans-serif">20182</font></td>
        <td nowrap="nowrap" align="left"><font size="3" face="Arial,Helvetica,sans-serif">VELOCITY SOLUTIONS INC.</font></td>
        <td nowrap="nowrap" align="left"><font size="3" face="Arial,Helvetica,sans-serif">EQPRAN77717</font></td>
        <td nowrap="nowrap" align="left"><font size="3" face="Arial,Helvetica,sans-serif">RANPAK FILLPAK TT 2</font></td>
        <td nowrap="nowrap" align="left"><font size="3" face="Arial,Helvetica,sans-serif">W/UNIVERSAL STAND S/N 51345563</font></td>
        <td nowrap="nowrap" align="right"><font size="3" face="Arial,Helvetica,sans-serif">1</font></td>
        <td nowrap="nowrap" align="left"><font size="3" face="Arial,Helvetica,sans-serif">51345563</font></td>
    </tr>
    <tr>
        <td nowrap="nowrap" align="left"><font size="1">&nbsp;</font></td>
        <td nowrap="nowrap" align="left"><font size="1">&nbsp;</font></td>
        <td nowrap="nowrap" align="left"><font size="1">&nbsp;</font></td>
        <td nowrap="nowrap" align="left"><font size="1">&nbsp;</font></td>
        <td align="left" colspan="5"><font size="1">&nbsp;</font></td>
    </tr>
    <tr>
        <td align="left"><font size="3" face="Arial,Helvetica,sans-serif">&nbsp;</font></td>
        <td align="left"><font size="3" face="Arial,Helvetica,sans-serif">Grand Total</font></td>
        <td align="left" colspan="7"><font size="1">&nbsp;</font></td>
    </tr>
    <tr>
        <td>&nbsp;</td>
        <td>&nbsp;</td>
        <td>&nbsp;</td>
        <td>&nbsp;</td>
        <td>&nbsp;</td>
        <td>&nbsp;</td>
        <td>&nbsp;</td>
        <td>&nbsp;</td>
        <td>&nbsp;</td>
    </tr>
</root>'''

soup = BeautifulSoup(content, 'html')

answer = []
rows = soup.find_all('tr')

for row in rows:
    if not row.text.strip():
        continue

    row_text = []
    for cell in row.find_all('td'):
        if cell.text.strip():
            row_text.append(cell.text)

    answer.append(row_text)

print(answer)

Выход

[[u'12', u'F5684', u'20182', u'VELOCITY SOLUTIONS INC.', u'EQPRAN77717', u'RANPAK FILLPAK TT 2', u'W/UNIVERSAL STAND S/N 51345563', u'1', u'51345563'], [u'Grand Total']]

Вы можете пропустить все пустые строки, используя if not row.text.strip(): continue (row.text.strip() возвращает пустую строку, которая оценивается как False).

Для строк, которые вы повторяете, вы можете проверить, что каждая ячейка не пуста, используя if cell.text.strip() перед сохранением соответствующего текста.

Другие вопросы по тегам