【问题标题】:How to parse a specific unregular table in python?如何解析python中的特定不规则表?
【发布时间】:2021-03-02 11:12:51
【问题描述】:

我尝试解析this example university timetable 已经有一段时间了。

最大的问题是这里的数据如何呈现。

每一天都由<tr> 分隔,<td> 内部附加到第一列。我尝试过 Pandas,但它对此感到困惑并打印出一些奇怪的表格。

url = r'http://www.plan.uz.zgora.pl/grupy_plan.php?ID=23563'
tables = pd.read_html(url)
print(tables)

Here is a link to this timetable如果有人感兴趣。


我也尝试将其转换为 JSON,但我从中获得的数据解析起来确实令人困惑。 Here, a link to Pastebin.

如果有任何解决方案,我将不胜感激。

【问题讨论】:

  • 欢迎来到 SO。这不是讨论论坛、教程或代码编写服务。请使用tour 并花时间阅读How to Ask 以及该页面上的其他链接。
  • 试试BeautifulSoup
  • 几乎所有 HTML 解析问题的答案都是BeautifulSoup。它可以以一种让您进行进一步处理的方式返回这些片段。
  • @wwii 我看不出这篇文章有资格成为“论坛讨论帖”,但感谢您提供的链接。以后我会尝试更好地表达问题。至于 BS4 - 我检查了它,它做得非常好!谢谢,肖恩和蒂姆!
  • read_html 适用于简单的表格,但对于更复杂的表格,您需要 BeautifulSouplxml 来解析 HTML/xml。 (PL: read_html jest dobre dla prostych tabel ale dla czegoś bardziej skomplikowanego potrzebujesz BeautifulSoup lub lxml aby parsować HTML/xml)

标签: python html pandas string parsing


【解决方案1】:

read_html() 适用于简单的表格,但对于更复杂的表格,您需要 BeautifulSouplxml 解析 HTML/xml 并处理 HTML/xml 中的每个元素(不仅带文字)

我使用BeautifulSoup 查找表中的所有行,跳过标题,然后我使用for-loop 分别处理每一行并检查class="gray" 以识别具有日期名称的行。

import requests 
from bs4 import BeautifulSoup
import pandas as pd

url = 'http://www.plan.uz.zgora.pl/grupy_plan.php?ID=23576'

response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')

data = []      # list for data from all rows

dayname = ''   # string with current day name 

# get all rows from table
all_rows = soup.find('table', {'id': 'table_groups'}).find_all('tr')

for row in all_rows[1:]:   # `[1:]` to skip header

    if 'gray' in row.get('class'):
        dayname = row.text.strip()
        print('DAY NAME:', dayname)
    else: 
        cols = row.find_all('td')  # get all columns in row
        cols = [x.text.strip() for x in cols]  # get text from all columns
        
        print('     Dzień:', dayname)
        print('        PG:', cols[0])
        print('        Od:', cols[1])
        print('        Do:', cols[2])
        print(' Przedmiot:', cols[3])
        print('        RZ:', cols[4])
        print('Nauczyciel:', cols[5])
        print('   Miejsce:', cols[6])
        print('   Terminy:', cols[7])
        
        cols.insert(0, dayname)  # add day name to row as first column
        data.append(cols)  # keep row on list

    print('---')
    

结果:

DAY NAME: Poniedziałek
---
     Dzień: Poniedziałek
        PG: 
        Od: 07:35
        Do: 09:00
 Przedmiot: Technika eksperymentu
        RZ: W
Nauczyciel: dr hab. inż. Ryszard Rybski, prof. UZ
   Miejsce: 
   Terminy: DI
---
     Dzień: Poniedziałek
        PG: 
        Od: 09:15
        Do: 10:45
 Przedmiot: Analiza danych
        RZ: W
Nauczyciel: prof. dr hab. inż. Dariusz Uciński
   Miejsce: 
   Terminy: D
---
     Dzień: Poniedziałek
        PG: A
        Od: 11:00
        Do: 12:30
 Przedmiot: Programowanie obiektowe
        RZ: L
Nauczyciel: dr inż. Paweł Majdzik
   Miejsce: 
   Terminy: D
---
     Dzień: Poniedziałek
        PG: B
        Od: 12:45
        Do: 14:15
 Przedmiot: Programowanie obiektowe
        RZ: L
Nauczyciel: dr inż. Paweł Majdzik
   Miejsce: 
   Terminy: D
---
DAY NAME: Wtorek
---
     Dzień: Wtorek
        PG: 
        Od: 09:15
        Do: 10:45
 Przedmiot: Teoretyczne podstawy informatyki
        RZ: W
Nauczyciel: prof. dr hab. inż. Andrzej Obuchowicz
   Miejsce: 
   Terminy: D
---
     Dzień: Wtorek
        PG: 
        Od: 11:00
        Do: 12:30
 Przedmiot: Teoretyczne podstawy informatyki
        RZ: Ć
Nauczyciel: prof. dr hab. inż. Andrzej Obuchowicz
   Miejsce: 
   Terminy: D
---
     Dzień: Wtorek
        PG: 
        Od: 12:45
        Do: 14:20
 Przedmiot: Podstawy systemów dyskretnych
        RZ: Ć
Nauczyciel: prof. dr hab. Roman Gielerak
   Miejsce: 
   Terminy: DN
---
     Dzień: Wtorek
        PG: 
        Od: 14:30
        Do: 16:00
 Przedmiot: Podstawy systemów dyskretnych
        RZ: W
Nauczyciel: prof. dr hab. Roman Gielerak
   Miejsce: 
   Terminy: D
---
DAY NAME: Środa
---
     Dzień: Środa
        PG: 
        Od: 07:35
        Do: 09:00
 Przedmiot: Fizyka
        RZ: W
Nauczyciel: dr Stefan Jerzyniak
   Miejsce: 
   Terminy: DP
---
     Dzień: Środa
        PG: B
        Od: 09:15
        Do: 10:45
 Przedmiot: Analiza danych
        RZ: L
Nauczyciel: dr hab. inż. Andrzej Janczak, prof. UZ
   Miejsce: 
   Terminy: D
---
     Dzień: Środa
        PG: A
        Od: 11:00
        Do: 12:30
 Przedmiot: Analiza danych
        RZ: L
Nauczyciel: dr hab. inż. Andrzej Janczak, prof. UZ
   Miejsce: 
   Terminy: D
---
     Dzień: Środa
        PG: 
        Od: 12:45
        Do: 14:15
 Przedmiot: Programowanie obiektowe
        RZ: W
Nauczyciel: dr inż. Paweł Majdzik
   Miejsce: 
   Terminy: D
---
     Dzień: Środa
        PG: A
        Od: 15:50
        Do: 17:25
 Przedmiot: Podstawy systemów dyskretnych
        RZ: L
Nauczyciel: mgr inż. Mariusz Downar
   Miejsce: 
   Terminy: DN
---
     Dzień: Środa
        PG: B
        Od: 19:05
        Do: 20:40
 Przedmiot: Podstawy systemów dyskretnych
        RZ: L
Nauczyciel: mgr inż. Mariusz Downar
   Miejsce: 
   Terminy: DN
---
DAY NAME: Czwartek
---
     Dzień: Czwartek
        PG: A
        Od: 07:45
        Do: 10:00
 Przedmiot: Technika eksperymentu
        RZ: L
Nauczyciel: dr hab. inż. Sergiusz Sienkowski, prof. UZ
   Miejsce: 
   Terminy: 2021-03-04; 2021-03-11; 2021-03-18; 2021-03-25; 2021-04-08; 2021-04-15; 2021-04-22; 2021-04-29; 2021-05-06; 2021-05-13
---
     Dzień: Czwartek
        PG: 
        Od: 11:00
        Do: 12:30
 Przedmiot: Fizyka
        RZ: Ć
Nauczyciel: dr Krzysztof Maciesiak
   Miejsce: 
   Terminy: D
---
     Dzień: Czwartek
        PG: B
        Od: 12:45
        Do: 15:00
 Przedmiot: Technika eksperymentu
        RZ: L
Nauczyciel: dr hab. inż. Sergiusz Sienkowski, prof. UZ
   Miejsce: 
   Terminy: 2021-03-04; 2021-03-11; 2021-03-18; 2021-03-25; 2021-04-08; 2021-04-15; 2021-04-22; 2021-04-29; 2021-05-06; 2021-05-13
---
DAY NAME: Piątek
---
     Dzień: Piątek
        PG: 
        Od: 09:15
        Do: 10:45
 Przedmiot: Wprowadzenie do sieci komputerowych
        RZ: W
Nauczyciel: dr hab. inż. Marcin Mrugalski, prof. UZ
   Miejsce: 
   Terminy: D

您可以使用pandas将其保存为csvjson

df = pd.DataFrame(data, columns=['Dzień', 'PG', 'Od', 'Do', 'Przedmiot', 'RZ', 'Nauczyciel', 'Miejsce', 'Terminy'])
print(df)

df.to_csv('output.csv', index=False)
df.to_json('output.json', orient='records', indent=2, force_ascii=False)

print(df.to_json(orient='records', indent=2, force_ascii=False))

结果:

[
  {
    "Dzień":"Poniedziałek",
    "PG":"A",
    "Od":"07:30",
    "Do":"09:00",
    "Przedmiot":"Seminarium dyplomowe I",
    "RZ":"P",
    "Nauczyciel":"prof. dr hab. inż. Krzysztof Patan",
    "Miejsce":"",
    "Terminy":"D"
  },
  {
    "Dzień":"Poniedziałek",
    "PG":"B",
    "Od":"09:15",
    "Do":"10:45",
    "Przedmiot":"Seminarium dyplomowe I",
    "RZ":"P",
    "Nauczyciel":"prof. dr hab. inż. Krzysztof Patan",
    "Miejsce":"",
    "Terminy":"D"
  },
  {
    "Dzień":"Poniedziałek",
    "PG":"A",
    "Od":"09:15",
    "Do":"12:15",
    "Przedmiot":"Projekt grupowy",
    "RZ":"P",
    "Nauczyciel":"dr inż. Anna Pławiak-Mowna",
    "Miejsce":"",
    "Terminy":"D"
  },
  {
    "Dzień":"Poniedziałek",
    "PG":"B",
    "Od":"11:00",
    "Do":"12:30",
    "Przedmiot":"Testowanie i rozwój aplikacji",
    "RZ":"L",
    "Nauczyciel":"dr inż. Jacek Bieganowski",
    "Miejsce":"",
    "Terminy":"D"
  },
  {
    "Dzień":"Poniedziałek",
    "PG":"A",
    "Od":"12:45",
    "Do":"14:15",
    "Przedmiot":"Testowanie i rozwój aplikacji",
    "RZ":"L",
    "Nauczyciel":"dr inż. Jacek Bieganowski",
    "Miejsce":"",
    "Terminy":"D"
  },
  {
    "Dzień":"Poniedziałek",
    "PG":"B",
    "Od":"12:45",
    "Do":"14:20",
    "Przedmiot":"Platforma.NET",
    "RZ":"P",
    "Nauczyciel":"dr inż. Marek Sawerwain",
    "Miejsce":"",
    "Terminy":"DN"
  },
  {
    "Dzień":"Wtorek",
    "PG":"A",
    "Od":"07:30",
    "Do":"12:30",
    "Przedmiot":"Język angielski IV\/Język niemiecki IV",
    "RZ":"L",
    "Nauczyciel":"mgr Jolanta Bąk",
    "Miejsce":"",
    "Terminy":"D"
  },
  {
    "Dzień":"Wtorek",
    "PG":"B",
    "Od":"07:30",
    "Do":"12:30",
    "Przedmiot":"Język angielski IV\/Język niemiecki IV",
    "RZ":"L",
    "Nauczyciel":"mgr Jolanta Bąk",
    "Miejsce":"",
    "Terminy":"D"
  },
  {
    "Dzień":"Środa",
    "PG":"",
    "Od":"07:30",
    "Do":"09:05",
    "Przedmiot":"Projektowanie sieci komputerowych",
    "RZ":"W",
    "Nauczyciel":"dr hab. inż. Bartłomiej Sulikowski, prof. UZ",
    "Miejsce":"",
    "Terminy":"DN"
  },
  {
    "Dzień":"Środa",
    "PG":"",
    "Od":"07:35",
    "Do":"09:00",
    "Przedmiot":"Testowanie i rozwój aplikacji",
    "RZ":"W",
    "Nauczyciel":"dr inż. Jacek Bieganowski; dr inż. Michał Doligalski",
    "Miejsce":"",
    "Terminy":"DP"
  },
  {
    "Dzień":"Środa",
    "PG":"B",
    "Od":"09:15",
    "Do":"10:45",
    "Przedmiot":"Projektowanie sieci komputerowych",
    "RZ":"L",
    "Nauczyciel":"mgr inż. Marcin Pazera",
    "Miejsce":"",
    "Terminy":"D"
  },
  {
    "Dzień":"Środa",
    "PG":"",
    "Od":"11:00",
    "Do":"12:30",
    "Przedmiot":"Platforma.NET",
    "RZ":"W",
    "Nauczyciel":"dr inż. Marek Sawerwain",
    "Miejsce":"",
    "Terminy":"D"
  },
  {
    "Dzień":"Środa",
    "PG":"A",
    "Od":"12:45",
    "Do":"14:15",
    "Przedmiot":"Projektowanie sieci komputerowych",
    "RZ":"L",
    "Nauczyciel":"mgr inż. Marcin Pazera",
    "Miejsce":"",
    "Terminy":"D"
  },
  {
    "Dzień":"Środa",
    "PG":"B",
    "Od":"12:45",
    "Do":"14:15",
    "Przedmiot":"Platforma.NET",
    "RZ":"L",
    "Nauczyciel":"dr inż. Marek Sawerwain",
    "Miejsce":"",
    "Terminy":"D"
  },
  {
    "Dzień":"Czwartek",
    "PG":"B",
    "Od":"12:10",
    "Do":"15:10",
    "Przedmiot":"Projekt grupowy",
    "RZ":"P",
    "Nauczyciel":"dr inż. Małgorzata Mazurkiewicz",
    "Miejsce":"",
    "Terminy":"D"
  },
  {
    "Dzień":"Piątek",
    "PG":"A",
    "Od":"07:30",
    "Do":"09:00",
    "Przedmiot":"Platforma.NET",
    "RZ":"L",
    "Nauczyciel":"mgr inż. Mariusz Downar",
    "Miejsce":"",
    "Terminy":"2021-04-09; 2021-04-16; 2021-04-23; 2021-04-30; 2021-05-07; 2021-05-14; 2021-05-21; 2021-05-28; 2021-06-04; 2021-06-11; 2021-06-18"
  },
  {
    "Dzień":"Piątek",
    "PG":"",
    "Od":"09:30",
    "Do":"11:00",
    "Przedmiot":"Programowanie urządzeń mobilnych",
    "RZ":"W",
    "Nauczyciel":"dr inż. Piotr Powroźnik",
    "Miejsce":"",
    "Terminy":"D"
  },
  {
    "Dzień":"Piątek",
    "PG":"A",
    "Od":"11:10",
    "Do":"11:55",
    "Przedmiot":"Programowanie urządzeń mobilnych",
    "RZ":"P",
    "Nauczyciel":"dr inż. Piotr Powroźnik",
    "Miejsce":"",
    "Terminy":"D"
  },
  {
    "Dzień":"Piątek",
    "PG":"B",
    "Od":"12:05",
    "Do":"12:50",
    "Przedmiot":"Programowanie urządzeń mobilnych",
    "RZ":"P",
    "Nauczyciel":"dr inż. Piotr Powroźnik",
    "Miejsce":"",
    "Terminy":"D"
  },
  {
    "Dzień":"Piątek",
    "PG":"A",
    "Od":"14:20",
    "Do":"15:50",
    "Przedmiot":"Platforma.NET",
    "RZ":"P",
    "Nauczyciel":"mgr inż. Mariusz Downar",
    "Miejsce":"",
    "Terminy":"2021-04-09; 2021-04-16; 2021-04-23"
  },
  {
    "Dzień":"Piątek",
    "PG":"A",
    "Od":"14:20",
    "Do":"15:50",
    "Przedmiot":"Platforma.NET",
    "RZ":"L",
    "Nauczyciel":"mgr inż. Mariusz Downar",
    "Miejsce":"",
    "Terminy":"2021-05-14; 2021-05-28; 2021-06-11; 2021-06-18"
  },
  {
    "Dzień":"Piątek",
    "PG":"A",
    "Od":"16:00",
    "Do":"18:15",
    "Przedmiot":"Platforma.NET",
    "RZ":"P",
    "Nauczyciel":"mgr inż. Mariusz Downar",
    "Miejsce":"",
    "Terminy":"2021-05-28; 2021-06-11; 2021-06-18"
  }
]

代码需要一些代码才能在Przedmiot 中获取MiejsceGoogle Classroom

【讨论】:

  • 这是一个非常令人印象深刻的答案,谢谢!
  • 我在 GitHub 上保留的一些答案:python-examples
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-11
  • 1970-01-01
相关资源
最近更新 更多