1

我有一个包含多个表格的 HTML 文件。我想将第 1 列和第 3 列中的数据更改为名称+数字,其中数字在每行更新后递增。所以这:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">                              
<html lang="en">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>blah blah doc</title>
<style type="text/css">
...
...
</style>
</head>
<body>
<!-- lots of html tags p h1, h2 ul etc but no tables to be skipped over -->
<table id="something" summary="...">
<thead>
<th ...</th>
...
</thead>
<tbody>
<tr>
    <td>mark jones</td>

        <td>blah blah</td>
        <td>mark jones</td>
        <td>blah blah</td>
        <td>11/12/2009</td>
        <td>blah blah</td>

 </tr>
 ...

会成为:

...
<tr>
    <td>name1</td>

        <td>blah blah</td>
        <td>name1</td>
        <td>blah blah</td>
        <td>11/12/2009</td>
        <td>blah blah</td>

 </tr>

在表格之前、之后和表格之间还有许多其他 HTML 标记和文本。

上面只是一行的一个例子;每一行的名称和其他列数据不同。空白是我查看源代码时的显示方式。我对 Perl 和 Python 相当熟悉,但对解决这个问题的了解还不够。

4

1 回答 1

2

假设它在一张桌子上并且你已经lxml安装了(以及我还没有早上喝咖啡的警告!):

html = """
<table>
<tr>
    <td>mark jones</td>

        <td>blah blah</td>
        <td>mark jones</td>
        <td>blah blah</td>
        <td>11/12/2009</td>
        <td>blah blah</td>

 </tr></table>"""

import lxml.html
import lxml.etree
from itertools import count


tree = lxml.html.fromstring(html)
next_name = lambda count=count(1): 'name{}'.format(next(count))
for trs in tree.findall('tr'):
    tds = trs.findall('td')
    anon_name = next_name()
    tds[0].text = anon_name
    tds[2].text = anon_name

print lxml.etree.tostring(tree)

给你:

<table><tr><td>name1</td>

        <td>blah blah</td>
        <td>name1</td>
        <td>blah blah</td>
        <td>11/12/2009</td>
        <td>blah blah</td>

 </tr></table>
于 2013-02-08T09:35:32.603 回答