парсинг HTML в CSV в нескольких столбцах - PullRequest
0 голосов
/ 06 февраля 2020

Я новичок в stackoverflow и программирование в python. Я хотел бы проанализировать html, содержащий несколько таблиц, в CSV. В частности, я хотел бы получить следующий результат:

FruitA,QuantityA  
FruitB,QuantityB  
FruitC,QuantityC  
FruitD,QuantityD

Для этого я написал следующее:

from bs4 import BeautifulSoup
import csv
html = open("table.html").read()
soup = BeautifulSoup(html,features="html.parser")
table = soup.find("table")

output_Fruits = []
output_Qs =[]

for table_row in table.findAll('tr'):
    columnsFruit = table_row.findAll('<th> Fruit </th>')
    columnsQ = table_row.findAll('<th> Quantity </th>')
    if columnsFruit:
      rowFruit = table_row.findAll('td')
      output_Fruit = []
      output_Fruit.append(rowFruit.text)
      output_Fruits.append(output_Fruit)
    elif columnsQ:
      rowQ = table_row.findAll('td')
      output_Q = []
      output_Q.append(rowQ.text)
      output_Qs.append(output_Q)


with open('output.csv', 'w') as csvfile:
    writer = csv.writer(csvfile, delimiter=',')
    i=1
    i_max=len(output_Fruits)+1
    while i<i_max:
      writer.writerow(output_Fruits[i],output_Qs[i])
    i=i+1

Но вывод, который я получаю, является пустым файлом. Может кто-нибудь помочь? где ошибка?

Вот таблица. html файл, который я пытаюсь проанализировать>

<style type="text/css">
.tg  {border-collapse:collapse;border-spacing:0;}
.tg td{font-family:Arial, sans-serif;font-size:14px;padding:10px 5px;border-style:solid;border-width:1px;overflow:hidden;word-break:normal;border-color:black;}
.tg th{font-family:Arial, sans-serif;font-size:14px;font-weight:normal;padding:10px 5px;border-style:solid;border-width:1px;overflow:hidden;word-break:normal;border-color:black;}
.tg .tg-0lax{text-align:left;vertical-align:top}
</style>
<table>  
<tr>
    <th>Fruit</th>
    <td>a</td>
  </tr>
</table>
<table>  
<tr>
    <th>Quantity</th>
    <td>1</td>
  </tr>
</table>
<table>  
<tr>
    <th>Fruit</th>
    <td>b</td>
  </tr>
</table>
<table>  
<tr>
    <th>Quantity</th>
    <td>6</td>
  </tr>
</table>
<table>  
<tr>
    <th>Fruit</th>
    <td>c</td>
  </tr>
</table>
<table>  
<tr>
    <th>Quantity</th>
    <td>12</td>
  </tr>
</table>

1 Ответ

0 голосов
/ 07 февраля 2020

Входной файл в нечетном формате. Обычно я ожидаю одну таблицу с одной строкой заголовка, за которой следуют строки данных из двух столбцов. Но ниже анализирует таблицу как дано, хотя:

from bs4 import BeautifulSoup
import csv
html = open("table.html").read()
soup = BeautifulSoup(html,features="html.parser")

headers = soup.findAll('th') # find all headers, in order.
data = soup.findAll('td')    # find all data, in order.

with open('output.csv', 'w', newline='') as csvfile:
    writer = csv.writer(csvfile)

    # pair header and data.
    for header,datum in zip(headers,data):
        if header.text == 'Fruit': # fruit header first, remember it
            fruit = datum.text
        elif header.text == 'Quantity': # quantity header 2nd, write a row
            writer.writerow([fruit,datum.text])

output.csv

a,1
b,6
c,12
...