升级HtmlUnit至2.70:如何替代HtmlParser.parseHtml()方法
HtmlUnit 2.70 替代 HtmlParser.parseHtml() 的正确方式
在HtmlUnit 2.70版本中,旧的静态方法HtmlParser.parseHtml()已被移除,直接手动实例化HtmlPage和解析器会因缺失页面上下文(如脚本执行所需对象)报错,以下是两种可行的替代方案:
方案1:使用WebClient(推荐)
这是HtmlUnit的标准使用方式,WebClient会自动处理页面初始化和解析流程,避免上下文缺失问题:
// 初始化WebClient,可根据需求配置参数 WebClient webClient = new WebClient(); // 可选配置:比如禁用JavaScript(如果不需要脚本执行) webClient.getOptions().setJavaScriptEnabled(false); // 情况1:已有WebResponse对象时直接解析 HtmlPage htmlPage = webClient.getPage(tmpResponse); // 情况2:从原始HTML字符串构造页面 String rawHtml = "<html><body>...</body></html>"; WebResponseData responseData = new WebResponseData( rawHtml.getBytes(StandardCharsets.UTF_8), 200, "OK", new WebHeaderCollection() ); URL targetUrl = new URL("https://your-target-url.com"); WebResponse response = new WebResponse( responseData, targetUrl, HttpMethod.GET, System.currentTimeMillis() ); HtmlPage pageFromHtml = webClient.getPage(response);
方案2:使用PageCreator(底层场景适用)
如果需要更底层的控制,可通过WebClient的PageCreator来创建页面,它会自动完成页面上下文的初始化:
WebClient webClient = new WebClient(); PageCreator pageCreator = webClient.getPageCreator(); // 通过PageCreator创建HtmlPage,自动初始化所有必要组件 HtmlPage htmlPage = (HtmlPage) pageCreator.createPage(tmpResponse, tmpWebWindow);
错误原因说明
你直接通过new HtmlPage(tmpResponse, tmpWebWindow)创建页面的方式,跳过了HtmlUnit内部的初始化流程,页面所需的脚本关联对象(ScriptObject)未被正确实例化,因此调用parse方法时触发"No script object associated with the Page"错误。必须通过WebClient或PageCreator工厂类创建页面,才能保证所有依赖组件初始化完成。
内容的提问来源于stack exchange,提问作者carlos palma
相关产品推荐
相关产品推荐

