java HTML单元-从普通字符串读取?

7cjasjjr  于 2023-04-28  发布在  Java
关注(0)|答案(3)|浏览(78)

我想使用HTML Unit for JAVA。在所有的例子中,将从一个特定的网站读取HTML代码。
但是我想从另一个String读取HTML源代码。
就像这样:

String myString = "<html> myString and Content </html>";
HtmlPage page  = myString; // doesn´t work, how can I do something like this?

我只看到这样的例子:

final WebClient webClient = new WebClient();
    final HtmlPage page = webClient.getPage("http://htmlunit.sourceforge.net");

我也可以只读一张表吗?就像这样:

String myTable = "<table><td></td></table>";
HtmlTable table = myTable; // doesn´t work, how can I do something like this?

我现在的问题是,我如何才能正确地转换它?有人能帮帮我吗。

wqsoz72f

wqsoz72f1#

HtmlUnit并不是真正为这个用例设计的,所以让它工作总是有点麻烦。如果您没有特别绑定到HtmlUnit,那么最好使用jsoup之类的东西,它具有更好的内置支持,可以从字符串解析HTML。
也就是说,如果您绑定到HtmlUnit,则有可能使其工作。为了获得灵感,您可以看看HtmlUnit如何在它自己的测试套件中设置HtmlPage对象。
正如您在这里看到的,尽管无法直接从String构造HtmlPage,但可以创建一个MockWebConnection,它将在不涉及网络的情况下给予固定的响应。因此,您的代码可能看起来像这样:

String html = "<html>Your html here</html>";
WebClient client = new WebClient();
MockWebConnection connection = new MockWebConnection();
connection.setDefaultResponse(html);
client.setWebConnection(connection);
HtmlPage page = client.getPage(someUrl);

(对上面的错误表示歉意--我不再是Java项目的成员,所以现在没有方便的方法来测试它。也就是说,我确实花了一些时间在一个大型Java项目上,该项目在许多测试中使用了这种技术。它运行得相当好,但当我们升级HtmlUnit时,它往往有点脆弱。总的来说,当我们搬到Jsoup时,我们更开心了。)

tct7dpnv

tct7dpnv2#

这里有另一种方法,类似于科勒姆的方法,但略有不同。

WebClient webClient = new WebClient();
    URL url = new URL("http://example.com");
    WebRequest requestSettings = new WebRequest(url, HttpMethod.GET);

    StringWebResponse response = new StringWebResponse("<html> myString and Content </html>", url);

    HtmlPage page = HTMLParser.parseHtml(response, webClient.getCurrentWindow());

至于拿table,是有可能的。您可以使用上面的方法加载它,并使用下面的代码提取它。

HtmlTable table = page.getHtmlElementById("table1");

你可以用下面的代码遍历和单元格

for (final HtmlTableRow row : table.getRows()) {
    System.out.println("Found row");
    for (final HtmlTableCell cell : row.getCells()) {
        System.out.println("   Found cell: " + cell.asText());
    }
}

您可以通过下面的示例访问特定的单元格

System.out.println("Cell (1,2)=" + table.getCellAt(1,2));

请评论,如果你卡住了,我也许可以帮助

0dxa2lsx

0dxa2lsx3#

在HtmlUnit 2中。51.0至至少2。70.0这对我来说很有用:

try (final WebClient webClient = new WebClient()) {

     // found here: https://htmlunit.sourceforge.io/faq.html#HowToParseHtmlString
     // works for version 2.51.0 - 2.70.0 (newer not tested yet)
     HtmlPage page = webClient.loadHtmlCodeIntoCurrentWindow(pageAsString);

     // works for version 2.42.0 (not for 2.43.0)
     // HtmlPage page = new HtmlUnitNekoHtmlParser().parseHtml(response, webClient.getCurrentWindow());
  }

相关问题