分享

如何用htmlparser修改html中标签的内容

 昵称16784427 2015-01-08

刚接触htmlparser,想用htmlparser解析字符串

测试文本一<input name="text1" type="text" value="text1">

测试文本二

Java代码  收藏代码
  1. Stirng sText="<p><span name="first" style=""><b>测试文本一</b></span><input name="\"text1\"/" type="\"text\"" value="\"text1\""></p><p><span style="">测试文本二</span>其他数据;\";  
  2. Parser parser = new Parser();   // parser.setURL  
  3. parser.setInputHTML(sText);  
  4. parser.setEncoding(parser.getEncoding());  
  5. NodeFilter filter = new NodeClassFilter(Span.class);  
  6. NodeList list = parser.extractAllNodesThatMatch(filter);  
  7. for (int i = 0; i < list.size(); i++) {  
  8.          if (list.elementAt(i) instanceof Span) {  
  9.                 Span spanTag = (Span ) list.elementAt(i);  
  10.     textnode.setAttributeEx(textnode.getAttributeEx("name"));  
  11.                 if(spanTag .getAttribute("name").equals("first")){  
  12.                      spanTag .setAttribute("value""bbb");  
  13.            }         }  
  14. }</p>  

 

我已经用span过滤掉了其他内容,部分源码如上,我现在想将上面文本中的标签中的name="first"的value值改为"bbb",然后返回所有文本即改过的(sText),但是不能用sText.replace()方法,因为原文本中可能有多个value="aaa"的值.

 

大家有什么好的建议,最好是直接可以用htmlparser处理的.谢谢


问题补充:
非常感谢大家的帮忙,尤其是lzj0470和ferreousbox,上面的问题已经解决, 

如果现在我想将字符串 
"

测试文本一<input name="text1/" type="text" value="text1">

测试文本二其他数据;" 
中的"测试文本二"替换成"此处已经被替换";即返回的字符串为: 
"

测试文本一<input name="text1/" type="text" value="text1">

此处已经被替换其他数据;" 

这样该怎么实现,因为span标签中还含有等标签,而我对正则表达式又不熟,所以,sText.replace()方法实现不了,还是要请教大家了,谢谢哈 

2008年11月06日 12:21

5个答案按时间排序按投票排序

00

采纳的答案

楼上的代码是正解,可以解决这个问题,但是返回的结果如果span元素还有parent元素的话就不正确了,当然前提是不知道要解析的html代码是什么样的,所以应该这样做: 
public String parse(String text) { 
    String tmp = "<html><body>" + text + "</body></html"; 
    NodeList list = Parser.createParser(tmp, "GB2312").parse(new TagNameFilter("body")); 
    Node body = tmp.elementAt(0); 
    body.accept(new NodeVisitor() { 
        public void visitTag(Tag tag) { 
            if (tag.getClass() != Span.clss) return; 
            // replace attribute here,i ignore the code 
            ...... 
        } 
    }); 
    return body.toHtml(); 
}

2008年11月06日 22:46
00

引用
非常感谢大家的帮忙,尤其是lzj0470和ferreousbox,上面的问题已经解决


楼主如果觉得好的话,应该将积分奖给最好的答案。 
这样才能创造更好的问答氛围

2008年11月07日 22:51
00

/** 
* @param args 
* @throws ParserException 
*/ 
public static void main(String[] args) throws ParserException { 
// TODO Auto-generated method stub 
String sText="<p><span style=background-color: lime name=first value=aaa><b>测试文本一</b></span><input type=text value=text1 name=text1/><p><span style=background-color: lime name=first value=aaa>测试文本二</span>其他数据;";  
String sText_new = ""; 
Parser parser = new Parser(sText); 
NodeList list = parser.parse( 
new TagNameFilter("span") 
); 
if(list.size()>0){ 
for(int i=0; i < list.size(); i++){ 
Span span = (Span)list.elementAt(i); 
span.setAttribute("value", "bbb"); 

sText_new = list.toHtml(); 

System.out.println("sText_new="+sText_new); 


结果是sText_new=<span style=background-color: lime name=first value=bbb><b>测试文本一</b></span><span style=background-color: lime name=first value=bbb>测试文本二</span> 

2008年11月06日 17:43
00

引用
我已经用span过滤掉了其他内容,部分源码如上,我现在想将上面文本中的<span>标签中的name="first"的value值改为"bbb",然后返回所有文本即改过的(sText),但是不能用sText.replace()方法,因为原文本中可能有多个value="aaa"的值.


这句话不是很理解 

楼主可以发一份你用的htmlparser.jar版本给我,或者放到你的博客上面吗?

2008年11月06日 14:02
00

不如用用nekohtml+dom4j, 
因为虽然htmlparser堪称经典,但有些老了, 
并且也没有版本升级了。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多