我发现了几个有类似问题和有价值答案的主题,但我仍然在努力解决这个问题:
我想用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)
在我引入的新元素之前和之后插入换行符.这不是一个真正的问题,因为如果我使用#change#来进行替换并且在doc.toString()之后我将它们删除它们,我将它们再次替换为所需的值(使用<>).
真正的问题:href中的URL已被修改,我不希望它发生.
想法?谢谢.
我想用 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)
但结果还是和以前一样。
如何才能做到这一点?我觉得我正在把简单的事情变得困难......
我有这个 php 脚本:
\n\n<?php\n $cmd_desformat = "/usr/local/bin/process /tmp/input.txt > /tmp/output.txt";\n shell_exec($cmd_desformat);\nRun Code Online (Sandbox Code Playgroud)\n\n其中 input.txt 是一个 UTF-8 文件(使用“file -i”检查)包含:
\n\nBuenos d\xc3\xadas\nRun Code Online (Sandbox Code Playgroud)\n\n/usr/local/bin/process 是来自第三方的二进制可执行文件,我广泛使用过它,但从未遇到过这个问题。
\n\n好吧,问题是当我从浏览器执行此操作时:
\n\nhttp://localhost/test.php\nRun Code Online (Sandbox Code Playgroud)\n\n结果output.txt是一个US-ASCII文件,包含:
\n\nBuenos d?as [][\nRun Code Online (Sandbox Code Playgroud)\n\n但是,当我从命令行执行此操作时:
\n\nphp test.php\nRun Code Online (Sandbox Code Playgroud)\n\n结果output.txt是一个UTF-8文件,其内容如下:
\n\nBuenos d\xc3\xadas [][\nRun Code Online (Sandbox Code Playgroud)\n\n我尝试与用户一起从命令行执行,www-data看看是否可以复制浏览器行为,但结果又是正确的。我也尝试过使用exec而不是shell_exec但结果是一样的。还尝试过 Firefox 和 Chrome。
我需要它在从浏览器调用时工作。有任何想法吗?
\n