【问题标题】:looping once over html as a string在 html 上循环一次作为字符串
【发布时间】:2026-02-01 17:35:01
【问题描述】:

我尝试从 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&lt;/title&gt;\n&lt;/head&gt;\n&lt;body \n&lt;tr&gt;&lt;td&gt; There are some information coming here&lt;/td&gt;&lt;/tr&gt;\n&lt;tbody&gt;&lt;table&gt;\n&lt;tr&gt;&lt;td&gt;&lt;a href="d?k=101', 'First', 'London', '24', '3', '19:00'], ['102', 'Second', 'NewYork', '24', '4', '20:13']...

我不明白为什么我的helper 开始表现得这样,我不知道应该如何编写这样的程序。你能提出一个好的/有效的方法来编写它或修复我的循环吗?

【问题讨论】:

标签: python loops while-loop


【解决方案1】:

我建议您花一些时间查看LXML。它允许您查看 html 文件中的所有表格并使用构成表格的事物的子元素(如行和单元格)

LXML 不难使用,它允许您使用

输入字符串
html.fromstring(somestring)

此外,这里有很多关于 SO 的 lxml 问题已经被提出和回答,因此不难找到好的例子来工作

【讨论】:

    【解决方案2】:

    您没有检查 find 的返回值,当它没有找到匹配项时它返回 -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)
    

    【讨论】: