5

我的 html 内容看起来像

<body>Hello world</div><div>New day</div></body>

我想解析这个 html 片段并在 Hello 之前添加一个起始 div 标记。我可以遵循什么方法?我尝试使用HTMLCLeaner但它没有帮助基本上这意味着找到结束 div 标签而不匹配开始 div 标签并添加它们。

4

7 回答 7

2

如果您使用 java 尝试使用Jsoup。就像是

Jsoup.clean("<body><div>Hello world</div><div>New day</div></body>", Whitelist.relaxed());

这将为您提供正确的输出字符串。

更新

您可以使用Jsoup.parse(html)which 返回 aDocument您可以调用它toString()来获取固定的 html,该 html 也将包括所有htmlbody标签。它将为您提供以下 html 输出。

   <html>
    <head></head>
    <body>
      <div>
        Hello world
      </div
      <div>
        New day
      </div>
    </body>
   </html>

正如您所说,大多数解析器将修复结束标签而不是开始标签,因为除了错误的结束标签之前,他们无法决定从哪里开始开始标签,并且在结束之前添加开始标签是没有用的标签。

您可能需要按照 Trevor Hutto 的建议(基于堆栈的方法)来实现您自己的逻辑,但它会有自己的复杂性取决于您的要求。

于 2014-03-07T20:54:29.947 回答
1

你可以使用堆栈。

推送打开的标签,然后当您点击关闭标签时,弹出并将弹出的标签与您刚刚遇到的标签进行比较。

所以很明显,如果你有一个不匹配的,它是一个 div,你可以做一些事情。

于 2014-03-07T20:43:22.903 回答
1

John Resig 的HTML Parser在这方面做得很好。它有点旧,但它仍然适用于我的大部分用例。

编辑:实际上,它似乎只修复缺少的结束标签,而不是开始标签......尽管一些调整可能可以让它做后者。

于 2014-03-07T21:02:28.913 回答
0
<body>
<div>Hello world</div>
<div>New day</div>
</body>

You can add a div before the hello world or you can remove the closing div after the hello world. Hello world New day

于 2014-03-20T10:52:23.057 回答
0

我创建了一个Javascript/jQuery解决方案来添加缺少的起始标签:

演示小提琴/观看全屏

任何 HTML添加到缺少标签的正文中,例如:

hello</h3>
<p>hai</p>
Welcome to fiddle</span>
</div>

Javascript/jQuery

var content;
var i;
var result="";
var previousTag="";

function exeq(){
    var a = content.lastIndexOf('<body>');
    var z = content.lastIndexOf('</body>');
    content = content.substring(a+6,z);

    while(i!=-1){
    var startAngle = content.indexOf('<');
    var endAngle = content.indexOf('>');
        i=endAngle;
    var ele = content.substring(startAngle,endAngle+1);
        if(ele.indexOf("/")!=-1)
        {
            if(previousTag != ele.replace("/",""))
                result = result + ele.replace("/","");
        }
    result = result + content.substring(0,endAngle+1);
    content = content.substring(endAngle+1);
    previousTag = ele;
    }

    /*Below part only to append result to body*/
    $('body').append('<h4>Result</h4><textarea>'+result+'</textarea>');
    /******************************************/
}

$.get(window.location.href,function(data){
    typeof(data)=="object"?window.location = window.location.href:
    content = data;
    exeq();
});
于 2014-03-16T20:35:13.207 回答
0

您可以使用括号平衡中使用的相同技术,除了不返回 True/False,而是修复标签。我曾经为一个工作项目这样做过:

括号平衡的递归方法[python]

Trevor 所描述的与我所描述的相同(用于括号平衡)。

于 2014-03-07T20:45:42.550 回答
-2

您不需要 HTMLCLeaner 或任何工具,如果您需要使用 html 非常简单,只需记住所有标签 <'something'> 都与 a 接近,或者使用简单的 <'something'/> 进行总结!

于 2014-03-07T20:41:36.203 回答