Разбить таблицу HTML на список Python?
Я хотел бы взять таблицу HTML и проанализировать ее, чтобы получить список словарей. Каждый элемент списка будет словарем, соответствующим строке в таблице.
Если, например, у меня была таблица HTML с тремя столбцами (помечены тегами заголовков), "Событие", "Дата начала" и "Дата окончания", и в этой таблице было 5 записей, я хотел бы проанализировать эта таблица возвращает список длины 5, где каждый элемент представляет собой словарь с ключами "Событие", "Дата начала" и "Дата окончания".
Спасибо за помощь!
Ответы
Ответ 1
Вы должны использовать некоторую библиотеку разбора HTML, например lxml
:
from lxml import etree
s = """<table>
<tr><th>Event</th><th>Start Date</th><th>End Date</th></tr>
<tr><td>a</td><td>b</td><td>c</td></tr>
<tr><td>d</td><td>e</td><td>f</td></tr>
<tr><td>g</td><td>h</td><td>i</td></tr>
</table>
"""
table = etree.HTML(s).find("body/table")
rows = iter(table)
headers = [col.text for col in next(rows)]
for row in rows:
values = [col.text for col in row]
print dict(zip(headers, values))
печатает
{'End Date': 'c', 'Start Date': 'b', 'Event': 'a'}
{'End Date': 'f', 'Start Date': 'e', 'Event': 'd'}
{'End Date': 'i', 'Start Date': 'h', 'Event': 'g'}
Ответ 2
Sven Marnach отличное решение напрямую переводится в ElementTree, который часть последних дистрибутивов Python:
from xml.etree import ElementTree as ET
s = """<table>
<tr><th>Event</th><th>Start Date</th><th>End Date</th></tr>
<tr><td>a</td><td>b</td><td>c</td></tr>
<tr><td>d</td><td>e</td><td>f</td></tr>
<tr><td>g</td><td>h</td><td>i</td></tr>
</table>
"""
table = ET.XML(s)
rows = iter(table)
headers = [col.text for col in next(rows)]
for row in rows:
values = [col.text for col in row]
print dict(zip(headers, values))
тот же результат, что и ответ Свена Марнаха...
Ответ 3
Если HTML не XML, вы не можете сделать это с помощью etree. Но даже тогда вам не нужно использовать внешнюю библиотеку для разбора таблицы HTML. В python 3 вы можете достичь своей цели с помощью HTMLParser
от html.parser
. У меня есть код простого производного класса HTMLParser здесь в реестре github.
Вы можете использовать этот класс (здесь с именем HTMLTableParser
) следующим образом:
import urllib.request
from html_table_parser import HTMLTableParser
target = 'http://www.twitter.com'
# get website content
req = urllib.request.Request(url=target)
f = urllib.request.urlopen(req)
xhtml = f.read().decode('utf-8')
# instantiate the parser and feed it
p = HTMLTableParser()
p.feed(xhtml)
print(p.tables)
Результатом этого является список 2D-списков, представляющих таблицы. Это выглядит, может быть, так:
[[[' ', ' Anmelden ']],
[['Land', 'Code', 'Für Kunden von'],
['Vereinigte Staaten', '40404', '(beliebig)'],
['Kanada', '21212', '(beliebig)'],
...
['3424486444', 'Vodafone'],
[' Zeige SMS-Kurzwahlen für andere Länder ']]]
Ответ 4
Руки вниз, самый простой способ проанализировать таблицу HTML - использовать pandas.read_html() - он принимает как URL-адреса, так и HTML.
import pandas as pd
url = r'https://en.wikipedia.org/wiki/List_of_S%26P_500_companies'
tables = pd.read_html(url) # Returns list of all tables on page
sp500_table = tables[0] # Select table of interest
Единственным недостатком является то, что read_html()
не сохраняет гиперссылки.