将HTML表解析为Python列表?

And*_*rew 43 html python

我想拿一个HTML表并解析它以获得字典列表.每个列表元素都是对应于表中行的字典.

例如,如果我有一个包含三列(由标题标记标记),"事件","开始日期"和"结束日期"的HTML表格,并且该表有5个条目,我想通过该表解析返回长度为5的列表,其中每个元素都是一个带有"事件","开始日期"和"结束日期"键的字典.

谢谢您的帮助!

Sve*_*ach 67

你应该使用一些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))
Run Code Online (Sandbox Code Playgroud)

版画

{'End Date': 'c', 'Start Date': 'b', 'Event': 'a'}
{'End Date': 'f', 'Start Date': 'e', 'Event': 'd'}
{'End Date': 'i', 'Start Date': 'h', 'Event': 'g'}
Run Code Online (Sandbox Code Playgroud)


zel*_*usp 35

放下解析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
Run Code Online (Sandbox Code Playgroud)

唯一的缺点是read_html()不保留超链接.

  • 谢谢!这是非常快速和容易的。 (2认同)
  • @JohnStrood 期待阅读您关于如何处理“rowspan”和“colspan”的答案 (2认同)

小智 29

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))
Run Code Online (Sandbox Code Playgroud)

与Sven Marnach的答案相同的输出......


sch*_*jos 18

如果HTML 不是 XML,则无法使用etree执行此操作.但即便如此,您也不必使用外部库来解析HTML表.在python 3中,你可以通过HTMLParserfrom 实现目标html.parser.我在github repo中有简单派生的HTMLParser类的代码.

您可以通过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)
Run Code Online (Sandbox Code Playgroud)

其输出是表示表的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 ']]]
Run Code Online (Sandbox Code Playgroud)

  • 很棒的解析器! (2认同)