小编Mar*_*dez的帖子

仅在文本部分用jsoup替换字符串

我发现了几个有类似问题和有价值答案的主题,但我仍然在努力解决这个问题:

我想用Jsoup解析一些html,所以我可以替换,例如,

"changeme"
Run Code Online (Sandbox Code Playgroud)

<changed>changeme</changed>
Run Code Online (Sandbox Code Playgroud)

,但只有当它出现在html的文本部分时,否则,如果它是标记的一部分.所以,从这个html开始:

<body>
<p><a href="http://changeme.html">test changeme app</a></p>
</BODY>
</HTML>
Run Code Online (Sandbox Code Playgroud)

我想谈谈这个:

<body>
<p><a href="http://changeme.html">test <changed>changeme</changed> app</a></p>
</BODY>
</HTML>
Run Code Online (Sandbox Code Playgroud)

我尝试了几种方法,这一方法让我更接近预期的结果:

Document doc = null;
try {
    doc = Jsoup.parse(new File("tmp1450348256397.txt"), "UTF-8");
} catch (Exception ex) {
}

Elements els = doc.body().getAllElements();
for (Element e : els) {
    if (e.text().contains("changeme")) {
        e.html(e.html().replaceAll("changeme","<changed>changeme</changed>"));
    }
}
html = doc.toString();
System.out.println(html);
Run Code Online (Sandbox Code Playgroud)

但是通过这种方法,我发现了两个问题:

<body>
<p><a href="http://<changed>changeme</changed> .html">test
    <changed>
        changeme
    </changed> 
app</a></p>
</BODY>
</HTML>
Run Code Online (Sandbox Code Playgroud)
  1. 在我引入的新元素之前和之后插入换行符.这不是一个真正的问题,因为如果我使用#change#来进行替换并且在doc.toString()之后我将它们删除它们,我将它们再次替换为所需的值(使用<>).

  2. 真正的问题:href中的URL已被修改,我不希望它发生.

想法?谢谢.

java jsoup

13
推荐指数
2
解决办法
3484
查看次数

杰汤。按顺序打印所有文本节点

我想用 Jsoup 解析它(这是一个简化,我将解析整个网页)

<html><body><p>A<strong>B</strong>C<strong>D</strong>E</p></body></html>
Run Code Online (Sandbox Code Playgroud)

要按出现的顺序获取所有文本元素,请执行以下操作:

A B C D E
Run Code Online (Sandbox Code Playgroud)

我尝试了两种方法:

Elements elements = doc.children().select("*");
for (Element el : elements)
    System.out.println(el.ownText());
Run Code Online (Sandbox Code Playgroud)

返回:

A C E B D
Run Code Online (Sandbox Code Playgroud)

也就是说,“强”标签之间的元素位于末尾。

我还尝试过递归版本:

myfunction(doc.children());

private void myfunction(Elements elements) {
  for (Element el : elements){
    List<Node> nodos = el.childNodes();       
    for (Node nodo : nodos) {                
      if (nodo instanceof TextNode && !((TextNode) nodo).isBlank()) {
      System.out.println(((TextNode) nodo).text()); 
    }
  }
  myfunction(el.children());
} 
Run Code Online (Sandbox Code Playgroud)

但结果还是和以前一样。

如何才能做到这一点?我觉得我正在把简单的事情变得困难......

java textnode jsoup

4
推荐指数
1
解决办法
2795
查看次数

PHP。从命令行和浏览器调用 shell_exec 时的编码不同

我有这个 php 脚本:

\n\n
<?php\n  $cmd_desformat = "/usr/local/bin/process /tmp/input.txt > /tmp/output.txt";\n  shell_exec($cmd_desformat);\n
Run Code Online (Sandbox Code Playgroud)\n\n

其中 input.txt 是一个 UTF-8 文件(使用“file -i”检查)包含:

\n\n
Buenos d\xc3\xadas\n
Run Code Online (Sandbox Code Playgroud)\n\n

/usr/local/bin/process 是来自第三方的二进制可执行文件,我广泛使用过它,但从未遇到过这个问题。

\n\n

好吧,问题是当我从浏览器执行此操作时:

\n\n
http://localhost/test.php\n
Run Code Online (Sandbox Code Playgroud)\n\n

结果output.txt是一个US-ASCII文件,包含:

\n\n
Buenos d?as [][\n
Run Code Online (Sandbox Code Playgroud)\n\n

但是,当我从命令行执行此操作时:

\n\n
php test.php\n
Run Code Online (Sandbox Code Playgroud)\n\n

结果output.txt是一个UTF-8文件,其内容如下:

\n\n
Buenos d\xc3\xadas [][\n
Run Code Online (Sandbox Code Playgroud)\n\n

我尝试与用户一起从命令行执行,www-data看看是否可以复制浏览器行为,但结果又是正确的。我也尝试过使用exec而不是shell_exec但结果是一样的。还尝试过 Firefox 和 Chrome。

\n\n

我需要它在从浏览器调用时工作。有任何想法吗?

\n

php browser encoding utf-8

2
推荐指数
1
解决办法
1624
查看次数

标签 统计

java ×2

jsoup ×2

browser ×1

encoding ×1

php ×1

textnode ×1

utf-8 ×1