Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/90.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中以列表形式从html文件导入表的行_Python_Html_Python 2.7_Beautifulsoup - Fatal编程技术网

在python中以列表形式从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

我是一个python新手,我遇到了一些我无法解决的问题(即使在大约一百万次谷歌搜索之后)

我有超过100个html文件,每个文件中都有几个表。最后,我希望文件中第一个HTML表的每一行都是python中的一个列表,但是没有HTML标记。第一步,我想弄清楚如何去掉HTML标记,然后我需要弄清楚如何将其作为列表导入

我的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>&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;</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。如果你做对了就更有意义了…谢谢!