我尝试从html中的表中读取数据。我定期阅读,表长度总是变化,我不知道它的长度。但是表格始终采用相同的格式,因此我尝试识别某些模式并根据其位置读取数据。 html的格式为:
<head>
<title>Some webside</title>
</head>
<body
<tr><td> There are some information coming here</td></tr>
<tbody><table>
<tr><td><a href="d?k=101">First</a></td><td>London</td><td>24</td><td>3</td><td>19:00</td><td align="center"></td></tr>
<tr bgcolor="#cccccc"><td><a href="d?k=102">Second</a></td><td>NewYork</td><td>24</td><td>4</td><td>20:13</td><td align="center"></td></tr>
<tr><td><a href="d?k=201">Some surprise</a></td><td>Swindon</td><td>25</td><td>5</td><td>20:29</td><td align="center"></td></tr>
<tr bgcolor="#cccccc"><td><a href="d?k=202">Third</a></td><td>Swindon</td><td>24</td><td>6</td><td>20:45</td><td align="center"></td></tr>
</tbody></table>
<tr><td> There are some information coming here</td></tr>
</body>
我将html转换为字符串然后检查数据,但我只想读一遍。我的代码是:
def ReadTable(m):
refList = []
firstId = 1
nextId = 2
k = 1
helper = 1
while firstId != nextId:
row = []
helper = m.find('<td><a href="d?k=', helper) + 17
end_helper = m.find('">', helper)
rowId = m[helper : end_helper]
if k == 1: # to check if looped again
firstId = rowId
else:
nextId = rowId
row.append(rowId)
helper = end_helper + 2
end_helper = m.find('</a></td><td>', helper)
rowPlace = m[helper : end_helper]
row.append(rowPlace)
helper = m.find('</a></td><td>', end_helper) + 13
end_helper = m.find('</td><td>', helper)
rowCity = m[helper : end_helper]
row.append(rowCity)
helper = end_helper + 9
end_helper = m.find('</td><td>', helper)
rowDay = m[helper : end_helper]
row.append(rowDay)
helper = end_helper + 9
end_helper = m.find('</td><td>', helper)
rowNumber = m[helper : end_helper]
row.append(rowNumber)
helper = end_helper + 9
end_helper = m.find('</td>', helper)
rowTime = m[helper : end_helper]
row.append(rowTime)
refList.append(row)
k +=1
return refList
if __name__ == '__main__':
filePath = '/home/m/workspace/Tests/mainP.html'
fileRead = open(filePath)
myString = fileRead.read()
print myString
refList = ReadTable(myString)
print 'Final List = %s' % refList
我希望结果作为一个包含4个列表的列表:
Final List = [['101', 'First', 'London', '24', '3', '19:00'], ['102', 'Second', 'NewYork', '24', '4', '20:13'], ['201', 'Some surprise', 'Swindon', '25', '5', '20:29'], ['202', 'Third', 'Swindon', '24', '6', '20:45']]
我希望在第一次循环后再次读取字符串并再次找到firstId
,我的while-loop
将终止。相反,我有无限循环,我的列表开始看起来像这样:
Final List = [['101', 'First', 'London', '24', '3', '19:00'], ['102', 'Second', 'NewYork', '24', '4', '20:13'], ['201', 'Some surprise', 'Swindon', '25', '5', '20:29'], ['202', 'Third', 'Swindon', '24', '6', '20:45'], ['me webside</title>\n</head>\n<body \n<tr><td> There are some information coming here</td></tr>\n<tbody><table>\n<tr><td><a href="d?k=101', 'First', 'London', '24', '3', '19:00'], ['102', 'Second', 'NewYork', '24', '4', '20:13']...
我不明白为什么我的helper
开始这样做,我无法弄清楚应该如何编写这样的程序。你能建议一个好的/有效的方法来编写它或修复我的循环吗?
答案 0 :(得分:2)
我建议你花点时间看LXML。它允许您查看html文件中的所有表,并使用构成表的事物的子元素(如行和单元格)
LXML不难使用,它允许您使用
输入字符串html.fromstring(somestring)
此外,有很多lxml问题已在SO上提出并回答,因此不难找到合适的例子
答案 1 :(得分:1)
您没有检查查找的返回值,并且在找不到匹配项时返回-1。 http://docs.python.org/2/library/string.html#string.find 失败时返回-1
我更新了代码的这一部分,它会按照您的预期返回。下面的第一行和最后一行与您上面的内容相匹配,因此您可以找到替代品。
row = []
helper = m.find('<td><a href="d?k=', helper)
if helper == -1:
break
helper += 17
end_helper = m.find('">', helper)