Python: HTML в CSV с несколькими таблицами с использованием BeautifulSoup - PullRequest
0 голосов
/ 07 июня 2019

Я пытаюсь создать код, который преобразует файл .html в файл .csv.

Я написал код, который работает, если html-файл содержит только 1 таблицу .

from bs4 import BeautifulSoup
import csv

html = open("table.html").read()
soup = BeautifulSoup(html)
table = soup.find("table")

output_rows = []
for table_row in table.findAll('tr'):
    columns = table_row.findAll('td')
    output_row = []
    for column in columns:
        output_row.append(column.text)
    output_rows.append(output_row)
print(output_rows)

with open('output.csv', 'a') as csvfile:
    writer = csv.writer(csvfile)
    writer.writerows(output_rows)

Для проверки, работает ли она отлично, я пишу выходные строки.Этот код показывает их отлично;[['Data 1', 'Data 2', 'Data 3'], ['Hello', 'World', 'Wicaledon']]

И файл table.html выглядит следующим образом:

<table>
  <tr>
    <td>Data 1</td>
    <td>Data 2</td>
    <td>Data 3</td>
  </tr>
  <tr>
    <td>Hello</td>
    <td>World</td>
    <td>Wicaledon</td>
  </tr>
</table>

Но проблема в том; Если я использую файл table.html, который содержит 2стол как этот;

<html>
  <head>
    <title>Test Table</title>
  </head>
  <body>
    <h2>First Table</h2>
    <table>
      <tr>
        <td>A</td>
        <td>B</td>
      </tr>
      <tr>
        <td>C</td>
        <td>D</td>
      </tr>
      <tr>
        <td>E</td>
        <td>F</td>
      </tr>
      <tr>
        <td>G</td>
        <td>H</td>
      </tr>
    </table>

    <h2>Second Table</h2>
    <table>
      <tr>
        <td>1</td>
        <td>2</td>
        <td>3</td>
        <td>4</td>
        <td>5</td>
        <td>6</td>
      </tr>
      <tr>
        <td>2</td>
        <td>3</td>
        <td>4</td>
        <td>5</td>
        <td>6</td>
        <td>7</td>
      </tr>
      <tr>
        <td>3</td>
        <td>4</td>
        <td>5</td>
        <td>6</td>
        <td>7</td>
        <td>8</td>
      </tr>
      <tr>
        <td>4</td>
        <td>5</td>
        <td>6</td>
        <td>7</td>
        <td>8</td>
        <td>9</td>
      </tr>
      <tr>
        <td>5</td>
        <td>6</td>
        <td>7</td>
        <td>8</td>
        <td>9</td>
        <td>10</td>
      </tr>
      <tr>
        <td>6</td>
        <td>7</td>
        <td>8</td>
        <td>9</td>
        <td>10</td>
        <td>11</td>
      </tr>
    </table>
    </table>
  </body>
</html>

Он записывает выходные строки следующим образом;[['A', 'B'], ['C', 'D'], ['E', 'F'], ['G', 'H']]

И CSV-файл содержит только эти массивы.

Истинный вывод должен быть таким:

[['A', 'B'], ['C', 'D'], ['E', 'F'], ['G', 'H']]
[['1', '2', '3', '4', '5', '6'],
 ['2', '3', '4', '5', '6', '7'],
 ['3', '4', '5', '6', '7', '8'],
 ['4', '5', '6', '7', '8', '9'],
 ['5', '6', '7', '8', '9', '10'],
 ['6', '7', '8', '9', '10', '11']]

И эти 2 массива должны быть записаны в CSV-файл.

Как я могу исправить свой код, используя BeautifulSoup и CSV-модули

1 Ответ

1 голос
/ 07 июня 2019

Это потому, что вы использовали find (). Find вернет 1-е совпадение. Вам нужно использовать find_all (), чтобы получить все table.try сейчас.

from bs4 import BeautifulSoup
data='''<html>
  <head>
    <title>Test Table</title>
  </head>
  <body>
    <h2>First Table</h2>
    <table>
      <tr>
        <td>A</td>
        <td>B</td>
      </tr>
      <tr>
        <td>C</td>
        <td>D</td>
      </tr>
      <tr>
        <td>E</td>
        <td>F</td>
      </tr>
      <tr>
        <td>G</td>
        <td>H</td>
      </tr>
    </table>

    <h2>Second Table</h2>
    <table>
      <tr>
        <td>1</td>
        <td>2</td>
        <td>3</td>
        <td>4</td>
        <td>5</td>
        <td>6</td>
      </tr>
      <tr>
        <td>2</td>
        <td>3</td>
        <td>4</td>
        <td>5</td>
        <td>6</td>
        <td>7</td>
      </tr>
      <tr>
        <td>3</td>
        <td>4</td>
        <td>5</td>
        <td>6</td>
        <td>7</td>
        <td>8</td>
      </tr>
      <tr>
        <td>4</td>
        <td>5</td>
        <td>6</td>
        <td>7</td>
        <td>8</td>
        <td>9</td>
      </tr>
      <tr>
        <td>5</td>
        <td>6</td>
        <td>7</td>
        <td>8</td>
        <td>9</td>
        <td>10</td>
      </tr>
      <tr>
        <td>6</td>
        <td>7</td>
        <td>8</td>
        <td>9</td>
        <td>10</td>
        <td>11</td>
      </tr>
    </table>
    </table>
  </body>
</html>'''

soup=BeautifulSoup(data,'html.parser')
tables = soup.find_all("table")

output_rows = []
for table in tables:
 for table_row in table.findAll('tr'):
    columns = table_row.findAll('td')
    output_row = []
    for column in columns:
        output_row.append(column.text)
    output_rows.append(output_row)
print(output_rows)

output:

[['A', 'B'], ['C', 'D'], ['E', 'F'], ['G', 'H'], ['1', '2', '3', '4', '5', '6'], ['2', '3', '4', '5', '6', '7'], ['3', '4', '5', '6', '7', '8'], ['4', '5', '6', '7', '8', '9'], ['5', '6', '7', '8', '9', '10'], ['6', '7', '8', '9', '10', '11']]

Обновлен код

soup=BeautifulSoup(data,'html.parser')
tables = soup.find_all("table")
output_final_rows=[]

for table in tables:
  output_rows = []
  for table_row in table.findAll('tr'):

    columns = table_row.findAll('td')
    output_row = []
    for column in columns:
        output_row.append(column.text)
    output_rows.append(output_row)
  output_final_rows.append(output_rows)

print(output_final_rows)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...