在python中以列表形式从html文件导入表的行
我是一个python新手,我遇到了一些我无法解决的问题(即使在大约一百万次谷歌搜索之后) 我有超过100个html文件,每个文件中都有几个表。最后,我希望文件中第一个HTML表的每一行都是python中的一个列表,但是没有HTML标记。第一步,我想弄清楚如何去掉HTML标记,然后我需要弄清楚如何将其作为列表导入 我的HTML文件如下所示:在python中以列表形式从html文件导入表的行,python,html,python-2.7,beautifulsoup,Python,Html,Python 2.7,Beautifulsoup,我是一个python新手,我遇到了一些我无法解决的问题(即使在大约一百万次谷歌搜索之后) 我有超过100个html文件,每个文件中都有几个表。最后,我希望文件中第一个HTML表的每一行都是python中的一个列表,但是没有HTML标记。第一步,我想弄清楚如何去掉HTML标记,然后我需要弄清楚如何将其作为列表导入 我的HTML文件如下所示: <tr><td>1</td><td>FORWARD</td><td>72</t
<tr><td>1</td><td>FORWARD</td><td>72</td><td>20</td><td>60.29</td><td>55.00</td><td>5.00</td><td>3.00</td></tr>
<tr><td> </td><td>REVERSE</td><td>258</td><td>20</td><td>60.11</td><td>45.00</td><td>4.00</td><td>3.00</td></tr>
<tr><td>2</td><td>FORWARD</td><td>77</td><td>20</td><td>60.08</td><td>50.00</td><td>5.00</td><td>2.00</td></tr>
<tr><td> </td><td>REVERSE</td><td>258</td><td>20</td><td>60.11</td><td>45.00</td><td>4.00</td><td>3.00</td></tr>
soup = BeautifulSoup(html)
table = soup.find('table')
rows = table.findAll('tr')
for row in rows:
print [col.string for col in row.findAll('td')]
我读到BeautifulSoup可能会提供帮助,所以我尝试:
from bs4 import BeautifulSoup
def removeTags(html, *tags):
soup = BeautifulSoup(html)
for tag in tags:
for tag in soup.findAll(tag):
tag.replaceWith("")
return soup
testhtml = open('myfile.html', 'r')
print removeTags(testhtml, 'tr', 'td')
但这似乎删除了表中的所有信息,而不仅仅是HTML标记。我也试过其他几种方法,但我似乎被卡住了。如果您有任何建议,我将不胜感激。请尝试以下内容:
<tr><td>1</td><td>FORWARD</td><td>72</td><td>20</td><td>60.29</td><td>55.00</td><td>5.00</td><td>3.00</td></tr>
<tr><td> </td><td>REVERSE</td><td>258</td><td>20</td><td>60.11</td><td>45.00</td><td>4.00</td><td>3.00</td></tr>
<tr><td>2</td><td>FORWARD</td><td>77</td><td>20</td><td>60.08</td><td>50.00</td><td>5.00</td><td>2.00</td></tr>
<tr><td> </td><td>REVERSE</td><td>258</td><td>20</td><td>60.11</td><td>45.00</td><td>4.00</td><td>3.00</td></tr>
soup = BeautifulSoup(html)
table = soup.find('table')
rows = table.findAll('tr')
for row in rows:
print [col.string for col in row.findAll('td')]
编辑:
如果您想取回数字,可以在
列字符串上调用float
,但这会给“FORWARD”
等标记带来错误。不过,这应该可以让您开始了。这有点草率,但它确实起到了作用
with open('htmlfile.html','r') as file:
rows = []
for line in file:
start = max(line.find('FORWARD'),line.find('REVERSE'))
rows.append(line[start:].replace('<','').replace('>','').replace('/','').replace('td',' ').replace('tr',' ').strip().split(' '))
print(rows)
以open('htmlfile.html','r')作为文件的:
行=[]
对于文件中的行:
开始=最大值(line.find('FORWARD')、line.find('REVERSE'))
行.append(行[start:].replace(''','').replace('/'','').replace('td','').replace('tr','').strip().split('')
打印(行)
给定示例数据,您可以使用以下代码以列表的形式获取第一行:
>>> list(soup.find('tr').strings)
[u'1', u'FORWARD', u'72', u'20', u'60.29', u'55.00', u'5.00', u'3.00']
我道歉。你的答案看起来和我发布的非常相似,我正试图编辑我的答案。我不小心编辑了你的。@Eric别担心。回滚。假设HTML文件具有给定的行结构是一个坏主意。这对我来说非常有用,即使它有点凌乱。但是我不明白为什么行start=max(line.find('FORWARD')、line.find('REVERSE'))
起作用print(start)
返回值-1,根据python文档,该值表示它找不到字符串“FORWARD”或字符串“REVERSE”start==-1
表示FORWARD和REVERSE都不在同一行中。如果它们中的任何一个在同一行中,那么start设置为其中一个出现的第一个索引。哦,我明白了。我正在运行start=。。。这就是为什么我总是得到-1。如果你做对了就更有意义了…谢谢!