【问题标题】:Modifying HTML using java使用java修改HTML
【发布时间】:2015-03-07 18:03:12
【问题描述】:

我正在尝试读取 HTML 文件并添加指向某些文本的链接:

例如: 我想添加指向“Campaign0”文本的链接。 :

<td><p style="overflow: hidden; text-indent: 0px; "><span style="font-family: SansSerif;">101</span></p></td> 
<td><p style="overflow: hidden; text-indent: 0px; "><span style="font-family: SansSerif;">Campaign0</span>
<td><p style="overflow: hidden; text-indent: 0px; "><span style="font-family: SansSerif;">unknown</span></p></td>

要添加的链接:

<a href="Second.html">

我需要一个 JAVA 程序来修改 html 以在“Campaign0”上添加超链接。

我如何用 Jsoup 做到这一点?

我用 JSoup 试过这个:

        File input = new File("D://First.html");
        Document doc = Jsoup.parse(input, "UTF-8", "");
        Element span = doc.select("span").first(); <-- this is only for first span tag :(
        span.wrap("<a href="Second.html"></a>");

这是正确的吗?它不工作:(

简而言之:有什么类似的-->

 if find <span>Campaign0</span> 
 then replace by <span><a href="">Campaign0</a></span> 

在 JAVA 代码中使用 JSoup 或任何技术??

【问题讨论】:

标签: java html parsing dom jsoup


【解决方案1】:

您的代码似乎非常正确。要查找具有“Campaign0”、“Campaign1”等的跨度元素,可以使用 JSoup 选择器“span:containsOwn(Campaign0)”。请参阅jsoup.org 上有关 JSoup 选择器的其他文档。

找到元素并用链接包装它们后,调用 doc.html() 应该会返回修改后的 HTML 代码。这是一个工作示例:

input.html:

<table>
    <tr>
        <td><p><span>101</span></p></td>
        <td><p><span>Campaign0</span></p></td>
        <td><p><span>unknown</span></p></td>
    </tr>
    <tr>
        <td><p><span>101</span></p></td>
        <td><p><span>Campaign1</span></p></td>
        <td><p><span>unknown</span></p></td>
    </tr>
</table>

代码:

    File input = new File("input.html");
    Document doc = Jsoup.parse(input, "UTF-8", "");
    Element span = doc.select("span:containsOwn(Campaign0)").first();
    span.wrap("<a href=\"First.html\"></a>");
    span = doc.select("span:containsOwn(Campaign1)").first();
    span.wrap("<a href=\"Second.html\"></a>");
    String html = doc.html();
    BufferedWriter htmlWriter =
            new BufferedWriter(new OutputStreamWriter(new FileOutputStream("output.html"), "UTF-8"));
    htmlWriter.write(html);
    htmlWriter.close();

输出:

<html>
 <head></head>
 <body>
  <table> 
   <tbody>
    <tr> 
     <td><p><span>101</span></p></td> 
     <td><p><a href="First.html"><span>Campaign0</span></a></p></td> 
     <td><p><span>unknown</span></p></td> 
    </tr> 
    <tr> 
     <td><p><span>101</span></p></td> 
     <td><p><a href="Second.html"><span>Campaign1</span></a></p></td> 
     <td><p><span>unknown</span></p></td> 
    </tr> 
   </tbody>
  </table>
 </body>
</html>

【讨论】:

  • 嘿,感谢您的回复,但我认为您的工作仅适用于遇到的第一个 。就我而言,这不是第一个 :(
  • 您要将链接添加到哪个范围?第一个内容为“Campaign0”,还是其他规则?
  • 实际上整个 html 文件中都有很多跨度,例如 "Campaign0","Campaign1","Campaign2","Campaign3" .. 等。不同的html文件会有不同的超链接。
  • 所以问题是选择哪些跨度元素进行修改。您能否扩展您的输入示例以包含周围的 元素和另一个需要修改的跨度?选择规则是否可以类似于“表内每个 tr 元素的第二个 td 元素内的跨度元素”?
  • 使用像 doc.select("span:containsOwn(Campaign0)") 这样的选择器很容易找到 Campaign0。您说跨度的内容可以不同,例如“Campaign1”-您知道跨度可以包含的所有可能值吗?如果您有“Campaign0”、“Campaign1”、...的列表,您可以遍历列表并使用 span:containsOwn(Campaign0) 等选择每个跨度。
猜你喜欢
  • 2020-01-16
  • 1970-01-01
  • 2013-09-16
  • 2011-10-09
  • 2011-08-23
  • 2012-09-22
  • 2021-06-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多