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))
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
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)))
如果HTML是不是XML,你就不能用 * etree *。但即使这样,您也不必使用外部库来解析HTML表。在python 3中,你可以使用HTMLParser from html.parser来实现你的目标。我有简单派生的HTMLParser类here in a github repo的代码。 您可以按以下方式使用该类(此处命名为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条答案
按热度按时间v440hwme1#
你应该使用一些HTML解析库,比如
lxml
:印刷品
laik7k3q2#
解析HTML表最简单的方法是使用pandas.read_html()-它同时接受URL和HTML。
唯一的缺点是
read_html()
不保留超链接。clj7thdc3#
Sven Marnach优秀的解决方案可以直接翻译成ElementTree,这是最近Python发行版的一部分:
和斯文·马纳赫的答案一样
xyhw6mcr4#
如果HTML是不是XML,你就不能用 * etree *。但即使这样,您也不必使用外部库来解析HTML表。在python 3中,你可以使用
HTMLParser
fromhtml.parser
来实现你的目标。我有简单派生的HTMLParser类here in a github repo的代码。您可以按以下方式使用该类(此处命名为
HTMLTableParser
):其输出是表示表的2D列表的列表。它看起来可能像这样: