如何从HTML td标签中删除所有属性但在python中删除rowspan?

时间:2012-12-05 22:07:07

标签: python regex python-3.x html-parsing

使用 python 3.3 我试图使一些正则表达式替换失败。

我想删除td标记的所有属性,但rowspan属性除外(示例td在末尾)。

使用以下命令我可以在rowspan存在时成功替换:

re.sub('(<td)[^>]*([\\s]rowspan[\\s]*=[\\s]*[0-9]*)[^>]*(>)', handle_td, file_contents)

其中handle_td是:

def handle_td(matchobj):
    new_td = ''
    for curr_group in matchobj.groups(''):
        if curr_group != '':
            new_td += curr_group
    return new_td

但我还要照顾td的剩余部分。我没有管理。

如果我在第二个组之后添加?,则会将td标记更改为并保留rowspan属性。

我做错了什么?我该如何解决这个问题?

我没有开采另一个命令来处理其他td,但我没有管理......

<td width=307 valign=top style='width:230.3pt;border:solid windowtext 1.0pt; border-left:none;padding:0cm 5.4pt 0cm 5.4pt'>
<td width=307 rowspan=4 style='width:230.3pt;border:solid windowtext 1.0pt; border-top:none;padding:0cm 5.4pt 0cm 5.4pt'>
<td width=307 valign=top style='width:230.3pt;border-top:none;border-left: none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt; padding:0cm 5.4pt 0cm 5.4pt'>

这应该产生:

<td>
<td rowspan=4>
<td>

我以这种方式管理(如果您有更好的方式随意添加):

# Leave only specific attributes for td tags 
def filter_td_attributes(matchobj):
    if matchobj.group(1) == "rowspan":
        return matchobj.group(1) + '=' + matchobj.group(2)

# Loop the attributes of the td tags
def handle_td(matchobj):
    new_td = re.sub("([a-zA-Z]+)[\\s]*=[\\s]*([a-zA-Z0-9:;.\\-'\\s]*)([\\s]|>)", filter_td_attributes, matchobj.group(0))
    new_td = re.sub("[\\s]*$", '', new_td)
    new_td = new_td + ">" # close the td tag
    return new_td

file_contents = re.sub('[\\s]*</p>[\\s]*</td>', '</td>', file_contents)

1 个答案:

答案 0 :(得分:0)

当rowspan代码是可选的时,您必须使代码的[^>]*部分非贪婪:将其设为[^>]*?。它们一起变成了:

'(<td)[^>]*?([\\s]rowspan[\\s]*=[\\s]*[0-9]*)?[^>]*(>)'

贪婪的版本([^>]*)意味着“尽可能多地给我”&gt;“字符,但我会接受零”。

非贪婪版本([^>]*?)意味着“尽可能给我最少数量的非”&gt;“字符,同时仍然使整个正则表达式匹配”