我正在编写一个程序,需要从输入文本文件中读取数据,并在完成日期时保存变量。我正在使用Htmlunit,我遇到了错误:
com.gargoylesoftware.htmlunit.ScriptException: Exception invoking open
at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine$HtmlUnitContextAction.run(JavaScriptEngine.java:684)
at net.sourceforge.htmlunit.corejs.javascript.Context.call(Context.java:602)
at net.sourceforge.htmlunit.corejs.javascript.ContextFactory.call(ContextFactory.java:507)
at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine.callFunction(JavaScriptEngine.java:616)
at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine.callFunction(JavaScriptEngine.java:591)
at com.gargoylesoftware.htmlunit.html.HtmlPage.executeJavaScriptFunctionIfPossible(HtmlPage.java:985)
at com.gargoylesoftware.htmlunit.javascript.host.EventListenersContainer.executeEventHandler(EventListenersContainer.java:210)
at com.gargoylesoftware.htmlunit.javascript.host.EventListenersContainer.executeBubblingListeners(EventListenersContainer.java:230)
at com.gargoylesoftware.htmlunit.javascript.host.Node.fireEvent(Node.java:804)
at com.gargoylesoftware.htmlunit.javascript.host.Node.fireEvent(Node.java:738)
at com.gargoylesoftware.htmlunit.html.HtmlElement$1.run(HtmlElement.java:869)
at net.sourceforge.htmlunit.corejs.javascript.Context.call(Context.java:602)
at net.sourceforge.htmlunit.corejs.javascript.ContextFactory.call(ContextFactory.java:507)
at com.gargoylesoftware.htmlunit.html.HtmlElement.fireEvent(HtmlElement.java:874)
at com.gargoylesoftware.htmlunit.html.HtmlElement.doClickFireClickEvent(HtmlElement.java:1311)
at com.gargoylesoftware.htmlunit.html.HtmlElement.click(HtmlElement.java:1253)
at com.gargoylesoftware.htmlunit.html.HtmlElement.click(HtmlElement.java:1205)
at com.gargoylesoftware.htmlunit.html.HtmlElement.click(HtmlElement.java:1160)
at Docketscraper.scrapeWebsite(Docketscraper.java:58)
at Docketscraper.starter(Docketscraper.java:40)
我的代码是:
private static String startingMonth;
private static String startingDay;
private static String startingYear;
private static String endingMonth;
private static String endingDay;
private static String endingYear;
public static void starter() throws IOException{
Scanner sc = new Scanner("inputfile.txt").useDelimiter("\\s*|/");
while(sc.hasNext()) {
startingMonth = sc.next();
startingDay = sc.next();
startingYear = sc.next();
// skip "to"
sc.next();
endingMonth = sc.next();
endingDay = sc.next();
endingYear = sc.next();
scrapeWebsite();
}
}
其中scrapeWebsite运行htmlunit方法。 scrapeWebsite方法如下所示,它调用一个方法来解析数据:
public static void scrapeWebsite() throws IOException {
final WebClient webClient = new WebClient();
final HtmlPage page = webClient.getPage(url);
final HtmlForm form = page.getForms().get(0);
final HtmlElement button = form.getElementById("SheetContentPlaceHolder_C_searchresults_lbPrint");
final HtmlPage page2 = button.click();
try {
synchronized (page2) {
page2.wait(10000);
}
}
catch(InterruptedException e)
{
System.out.println("error");
}
originalHtml = page2.getWebResponse().getContentAsString();
obtainInformation();
originalHtml = "";
}
输入变量根据代码创建要搜索的URL:
private static String url = "http://cpdocket.cp.cuyahogacounty.us/SheriffSearch/results.aspx?q=searchType%3dCity%26searchString%3d%26foreclosureType%3d%26dateFrom%3d" + startingMonth + "%2f" + startingDay + "%2f" + startingYear + "+12%3a00%3a00+AM%26dateTo%3d" + endingMonth + "%2f" + endingDay + "%2f" + endingYear + "+11%3a59%3a59+PM";
这是网站特有的网址。我认为这是扫描仪方法的一个问题,因为当我手动输入6个变量的数字并运行“scrapeWebsite”时,会出现正确的输出。我甚至无法获得一组输入日期,其格式为:
1/1/2013 to 1/7/2013
我不确定“启动”方法有什么问题
答案 0 :(得分:0)
Scanner
本身没有问题。这只是在请求中获得格式不正确的javascript的问题。 HtmlUnit尝试解析它并且它无法抛出异常。
我已就此问题添加了answer一些想法。
除此之外,您始终可以使用setThrowExceptionOnScriptError(false)来抑制异常。
这将引导您完成异常,但不会更正javascript代码中的任何问题。如果给您带来麻烦的javascript函数恰好是数据提取过程中的关键部分,那么除了忘记HtmlUnit处理的Javascript并开始自己编写AJAX请求之外别无选择。另一方面,如果Javascript函数与您需要的实际处理没有任何关系,那么这很可能会起作用。
在HtmlUnit中进行webscraping时,这个问题很常见。
答案 1 :(得分:0)
我注意到的第一个问题是线
Scannersc = new Scanner("inputfile.txt").useDelimiter("\\s*|/");
扫描程序现在正在读取文本“inputfile.txt”。然后尝试用新文件替换它(“inputfile.txt”);但是如果你在另一个类中使用这个类,最好让整个目录例如“\ C:\ programdata \ Connors file \ inputfile.txt”这是一个例子,所以获取目录的最简单方法是转到该文件夹它在,右键单击文件属性并复制目录并添加\ inputfile.txt。 如果有帮助,请告诉我。
聚苯乙烯。 在紧急情况下 Scanner sc = new Scanner(new File(“inputfile.txt”))。useDelimiter(“delimiter”);