任何lib都可以在保留原始数据的同时操纵HTML代码的属性

时间:2014-07-19 07:08:24

标签: python html node.js beautifulsoup jsdom

假设我有以下代码。正如您所看到的,我有一些脚本或数据包含在&#34; %% [&#34;和&#34;] %%&#34;。通常这是非法的。这是我想保留的原始数据。同时我想添加/更改/删除<table>中的属性。然后在修改后输出代码。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
%%[
Sever Language data here
]%%
<title>%%=v(@variable)=%%</title>
</head>
<body>
    <div style="display:none;">
        <custom name="opencounter" type="tracking">
        <img width='0' height='0' src='%%=v(@adometry)=%%'> 
    </div>
    <table width="100%" cellpadding="0" cellspacing="0" border="0" bgcolor="#ffffff">
        <tr>
            <td align="center">Something here
            </td>
        </tr>
    </table>
</body>

我已经尝试了很多方法来解决这个问题。我尝试过Beautifulsoup。但它会改变一些特殊的角色,如&#34; - &#34;到&#34;&amp; mdash&#34;。我想保留特殊字符,如果它没有被编码为转义字符。 Beautifulsoup也改变了属性的顺序。对于<custom>代码,它会将其转换为<custom></custom>。我认为Beautifulsoup是一个善于解析数据而不是操纵数据的lib。

我很久以前也尝试过jsdom,我觉得它工作得很好。但是<custom>问题仍然存在问题。将<img>更改为<img />会有问题。不确定jsdom是否会保留非法数据。它工作得很慢......

我还试图在浏览器中使用jQuery来输出.html()函数。但它会改变属性的顺序。对于<table>标记,它会在其中插入<tbody>,这不是我想要的。

假设我想将cellpadding更改为10.代码应如下所示。也许我可以允许属性的不同顺序。有没有人知道我可以使用什么库或我可以做什么样的事情来处理这个要求。欢迎任何评论!!!顺便说一句,我对正则表达并不熟悉。我认为这会让我感到沮丧...

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
%%[
Sever Language data here
]%%
<title>%%=v(@variable)=%%</title>
</head>
<body>
    <div style="display:none;">
        <custom name="opencounter" type="tracking">
        <img width='0' height='0' src='%%=v(@adometry)=%%'> 
    </div>
    <table width="100%" cellpadding="10" cellspacing="0" border="0" bgcolor="#ffffff">
        <tr>
            <td align="center">Something here
            </td>
        </tr>
    </table>
</body>

2 个答案:

答案 0 :(得分:0)

jQuery我相信应该做你想要的,但不能用.html()函数。使表保持原样,然后使用jQuery选择它并修改属性。

我不确定您要添加/更改/删除哪些属性,但以下代码可以正常工作:

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<script type="text/javascript">
  $(function() {
    var $table = $('table');
    $table.attr('cellpadding', 10);  // modify
    $table.removeAttr('bgcolor');  // remove
    $table.attr('style', 'color: yellow;');  // add
  })
</script>

当然,你应该在表中添加一个类或id,以便更容易通过jQuery选择。

像BeautifulSoup这样的解析器通过将XML解析为它理解的对象来工作。当它写出HTML时,它会写出对象中的数据,而不是已解析的原始字符串。

答案 1 :(得分:0)

您的要求的唯一答案是,使用字符串操作:

text = text.replace('cellpadding="0"', 'cellpadding="10"')