Python: создание разрывов строк в списке для распознавания openpyxl в .xlsx - PullRequest
3 голосов
/ 03 июля 2019

Я собираю информацию с URL-адреса

Я могу успешно получить информацию в .xlsx

Она не в том формате, в котором я хочу, чтобы она была.

element_rows = []
for table_row in Elements.findAll('tr'):
    columns = table_row.findAll('td')
    output_row = []
    for column in columns:
        sub_rows = column.findAll('p')
        output_row.append('\r\n'.join(row.text for row in sub_rows))
    element_rows.append(output_row)

Я чувствую, что это что-то простое, но не могу его разместить.

Когда он повторяется, для каждого 'p' я хочу, чтобы он создал новую строку.

IЯ пытался использовать синтаксис Excel '\ r \ n', но чувствую, что это неправильно.Я пытался добавить (строку), но это вызывает у меня ошибки

В настоящее время это дает мне что-то вроде:

 |A    |B
1|Apple|PearOrangeBanana
2|Grape|MandarinOliveTomato

Я бы хотел, чтобы это было

 |A    |B
1|Apple|Pear
2|     |Orange
3|     |Banana
4|Grape|Mandarin
5|     |Olive
6|     |Tomato

ОК.Полный код выглядит следующим образом.

from bs4 import BeautifulSoup
import requests
import csv
from subprocess import Popen
import webbrowser
import re
from openpyxl import *
import tkinter as tk
import openpyxl
from itertools import zip_longest


#Variables
#Name of course
CourseName = 'AURAFA008'#input("Input Course Code: ")
#Base URL
TGAURL = 'https://training.gov.au/Training/Details/'
#.csv filename
CourseCSV = CourseName + '.csv'
CourseXLSX = CourseName + '.xlsx'
#Total URL of course
CourseURL = TGAURL + CourseName
#URL get
website_url = requests.get(CourseURL).text
#Beautiful soup work
soup = BeautifulSoup(website_url,'html.parser')
table = soup.table
#Excel Frameworks
# wb = Workbook()
wb = openpyxl.Workbook()
ws = wb.active
output_row = 1

#Open URL in browser
#webbrowser.open(CourseURL, 2)
# Define the tables I want to grab
Elements = (soup.find("h2", string="Elements and Performance Criteria")).find_next('table')
Foundation = (soup.find("h2", string="Foundation Skills")).find_next('table')
#Extract the data
Element_rows = []
for table_row in Elements.findAll('tr'):
    columns = table_row.findAll('td')
    output_row = []
    for column in columns:
        sub_rows = column.findAll('p')
        for row in sub_rows:
            output_row.append(row.get_text(separator=' '))
    Element_rows.append(output_row)

Foundation_rows = []

for table_row in Foundation.findAll('tr'):
    columns = table_row.findAll('td')
    output_row = []
    for column in columns:
        sub_rows = column.findAll('p')
        for row in sub_rows:
            output_row.append(row.get_text(separator=' '))
    Foundation_rows.append(output_row)


# Write the tables to .xlsx
Tab0 = (CourseName + 'Elements')
Tab1 = (CourseName + 'Foundation')
ws1 = wb.create_sheet(Tab0)
ws2 = wb.create_sheet(Tab1)

for row in Element_rows:
    ws1.append(row)
for row in Foundation_rows:
    ws2.append(row)
wb.remove(wb['Sheet'])
wb.save(CourseXLSX)
p = Popen(CourseXLSX, shell=True)

Ответы [ 2 ]

2 голосов
/ 03 июля 2019

Я бы порекомендовал вам писать в файл Excel по мере продвижения. Для каждой строки таблицы создайте список списков, содержащих любые имеющиеся подстроки. Затем вы можете использовать функцию Python zip_longest(), чтобы возвращать вложенную запись для каждой строки с пробелами, где один список короче другого, например:

from itertools import zip_longest
from bs4 import BeautifulSoup
import openpyxl


html = """
<table>
  <tr>
    <td><p>a</p><p>b</p></td>
    <td><p>1</p><p>2</p><p>3</p></td>
    <td><p>d</p></td>
  </tr>
  <tr>
    <td><p>a</p><p>b</p></td>
    <td><p>1</p><p>2</p><p>3</p></td>
    <td><p>d</p></td>
  </tr>
</table>
"""

soup = BeautifulSoup(html, "html.parser")
table = soup.table

wb = openpyxl.Workbook()
ws = wb.active
output_row = 1

for table_row in table.find_all('tr'):
    cells = table_row.find_all('td')
    row = [[row.text for row in cell.find_all('p')] for cell in cells]

    for row_number, cells in enumerate(zip_longest(*row, fillvalue=""), start=output_row):
        for col_number, value in enumerate(cells, start=1):
            ws.cell(column=col_number, row=row_number, value=value)

    output_row += len(cells)

wb.save('output.xlsx')

Это даст вам следующий вывод:

Excel screenshot

Функцию enumerate() можно использовать для получения номера приращения для каждой записи в списке. Это можно использовать для получения подходящих номеров строк и столбцов для ячеек openpyxl.

1 голос
/ 03 июля 2019

В настоящее время вы все еще помещаете все значения в одну и ту же ячейку, даже если добавляете разрывы строк.

Что вам нужно сделать, это добавить новые строки для каждого слова. Они должны быть в форме [None, 'Pear'], если вы хотите значения во втором столбце.

...