我有一个html文档,我想从这个文档中拉出表格并将它们作为数组返回。我正在想象两个函数,一个用于查找文档中的所有html表,另一个用于将html表转换为二维数组。
这样的事情:
htmltables = get_tables(htmldocument)
for table in htmltables:
array=make_array(table)
有2次捕获: 1.数字表每天都有所不同 这些表有各种奇怪的额外格式,比如粗体和闪烁标签,随机抛出。
谢谢!
答案 0 :(得分:18)
使用BeautifulSoup(我推荐3.0.8
)。查找所有表格是微不足道的:
import BeautifulSoup
def get_tables(htmldoc):
soup = BeautifulSoup.BeautifulSoup(htmldoc)
return soup.findAll('table')
然而,在Python中,array是1维的,并且被约束为非常基本的类型作为项(整数,浮点数, 基础)。因此,无法在Python array
中挤压HTML表。
也许你的意思是Python list
而已?这也是一维的,但任何东西都可以是一个项目,所以你可以有一个列表列表(每个tr
标签有一个子列表,我想,每td
个标签包含一个项目。)
这会给:
def makelist(table):
result = []
allrows = table.findAll('tr')
for row in allrows:
result.append([])
allcols = row.findAll('td')
for col in allcols:
thestrings = [unicode(s) for s in col.findAll(text=True)]
thetext = ''.join(thestrings)
result[-1].append(thetext)
return result
这可能还不是你想要的(不会跳过HTML注释,子列表的项目是unicode字符串而不是字节字符串等)但它应该很容易调整。
答案 1 :(得分:1)
问问者的+1,Python的另一个人 想要使用lxml和CSS选择器来尝试这个例子 是的,这与Alex的例子大致相同:
import lxml.html
markup = lxml.html.fromstring('''<html><body>\
<table width="600">
<tr>
<td width="50%">0,0,0</td>
<td width="50%">0,0,1</td>
</tr>
<tr>
<td>0,1,0</td>
<td>0,1,1</td>
</tr>
</table>
<table>
<tr>
<td>1,0,0</td>
<td>1,<blink>0,</blink>1</td>
<td>1,0,2</td>
<td><bold>1</bold>,0,3</td>
</tr>
</table>
</body></html>''')
tbl = []
rows = markup.cssselect("tr")
for row in rows:
tbl.append(list())
for td in row.cssselect("td"):
tbl[-1].append(unicode(td.text_content()))
pprint(tbl)
#[[u'0,0,0', u'0,0,1'],
# [u'0,1,0', u'0,1,1'],
# [u'1,0,0', u'1,0,1', u'1,0,2', u'1,0,3']]
答案 2 :(得分:1)
Pandas可以将html中的所有表格提取到开箱即用的数据框列表中,从而使您不必自己解析页面(重新发明轮子)。 DataFrame是一种强大的二维数组。
我建议继续使用Pandas处理数据,因为它是一个很棒的工具,但如果您愿意,还可以转换为其他格式(列表,字典,csv文件等)。
示例强>
"""Extract all tables from an html file, printing and saving each to csv file."""
import pandas as pd
df_list = pd.read_html('my_file.html')
for i, df in enumerate(df_list):
print df
df.to_csv('table {}.csv'.format(i))
直接从网络而不是从文件中获取html内容只需要稍作修改:
import requests
html = requests.get('my_url').content
df_list = pd.read_html(html)