将HTML表解析为Python列表?

将HTML表解析为Python列表?,python,html,Python,Html,我想获取一个HTML表并对其进行解析,以获得字典列表。每个列表元素都是对应于表中一行的字典 例如,如果我有一个HTML表,它有三列(由标题标记),“事件”、“开始日期”和“结束日期”,并且该表有5个条目,那么我想解析该表以返回一个长度为5的列表,其中每个元素是一个带有键“事件”、“开始日期”和“结束日期”的字典 谢谢你的帮助 您应该使用一些HTML解析库,如: Sven Marnach可直接翻译为最近Python发行版的一部分: from xml.etree import ElementTree

我想获取一个HTML表并对其进行解析,以获得字典列表。每个列表元素都是对应于表中一行的字典

例如,如果我有一个HTML表,它有三列(由标题标记),“事件”、“开始日期”和“结束日期”,并且该表有5个条目,那么我想解析该表以返回一个长度为5的列表,其中每个元素是一个带有键“事件”、“开始日期”和“结束日期”的字典


谢谢你的帮助

您应该使用一些HTML解析库,如:

Sven Marnach可直接翻译为最近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)))
从xml.etree导入ElementTree作为ET
s=”“”
事件开始日期结束日期
abc
def
ghi
"""
表=ET.XML
行=iter(表)
headers=[col.text表示下一行中的列]
对于行中的行:
values=[col.text代表行中的col]
打印(dict(zip(标题、值)))

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

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

您可以通过以下方式使用该类(此处名为
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 ']]]

简单地说,解析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()
不保留超链接。

我的表有不同数量的行。如果是这样的话,我怎么能让它工作呢?谢谢你的回复,顺便说一句。@Andrew:以上代码适用于任意行数和任意列数,只要每行的列数相同。我建议
HTMLParser
/
html.parser
,但这种解决方案在这种情况下要好得多。这是进行进一步研究的有用指针。事实上,我有一些不完整的HTML需要解析,所以一些涉及lxml.HTML的其他答案也被证明是有用的“+1,因为它允许使用cElementTree而不是ElementTree,如果涉及大量表,则ElementTree比lxml快得多。我从wikipedia保存了一个网页。如何向ET指定要解析和获取数据的表?是否可以通过表名或表id实现?也是,但不起作用。看,太棒了!谢谢,谢谢!这是非常快速和简单的。对于包含
rowspan
colspan
的表来说,这不是一个好方法@约翰斯特鲁德期待着阅读您关于如何处理
rowspan
colspan
@tommy.carstensen的回答!我使用
bs4
构建了一个元素树,并遍历元素,将跨行跨列的单元格分解为组成单元格。很棒的解析器!!
[[['   ', ' Anmelden ']],
 [['Land', 'Code', 'Für Kunden von'],
  ['Vereinigte Staaten', '40404', '(beliebig)'],
  ['Kanada', '21212', '(beliebig)'],
  ...
  ['3424486444', 'Vodafone'],
  ['  Zeige SMS-Kurzwahlen für andere Länder ']]]
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