当前位置: 首页 > 面试题库 >

如何用Jsoup填写表格?

靳高明
2023-03-14
问题内容

我试图浏览到加利福尼亚网站http://kepler.sos.ca.gov/的描述页面。但无法走。

然后,我有一个html表单,在该表单上我正在提交请求,我无法在此处添加表单,但是它只是带有必需参数的POST对http://kepler.sos.ca.gov/的请求

我能得到__EVENTTARGET并且__EVENTARGUMENT从我来到这里之前的页面。

我究竟做错了什么?

码:

String url = "kepler.sos.ca.gov/";
Connection.Response resp = Jsoup.connect(url)
                                .timeout(30000)
                                .method(Connection.Method.GET) 
                                .execute();
Document responseDocument = resp.parse();
Map<String, String> loginCookies = resp.cookies();
   eventValidation=responseDocument.select("input[name=__EVENTVALIDATION]").first();
viewState = responseDocument.select("input[name=__VIEWSTATE]").first();

问题答案:

您要使用FormElement。这是Jsoup的有用功能。它能够找到在表单内声明的字段并将其发布给您。发布表单之前,您可以使用Jsoup
API设置字段的值。

注意:

在下面的示例代码中,您将始终看到对Element#select方法的调用,以及对Elements#first方法的调用。

例如 : responseDocument.select("form#aspnetForm").first()

Jsoup
1.11.1引入了更有效的替代方法:Element#selectFirst。您可以将其用作原始替代品的直接替代品。

例如:
responseDocument.select("form#aspnetForm").first()
可以替换为
responseDocument.selectFirst("form#aspnetForm")

样本代码

// * Connect to website
String url = "http://kepler.sos.ca.gov/";
Connection.Response resp = Jsoup.connect(url) //
                                .timeout(30000) //
                                .method(Connection.Method.GET) //
                                .execute();

// * Find the form
Document responseDocument = resp.parse();
Element potentialForm = responseDocument.select("form#aspnetForm").first();
checkElement("form element", potentialForm);
FormElement form = (FormElement) potentialForm;

// * Fill in the form and submit it
// ** Search Type
Element radioButtonListSearchType = form.select("[name$=RadioButtonList_SearchType]").first();
checkElement("search type radio button list", radioButtonListSearchType);
radioButtonListSearchType.attr("checked", "checked");

// ** Name search
Element textBoxNameSearch = form.select("[name$=TextBox_NameSearch]").first();
checkElement("name search text box", textBoxNameSearch);
textBoxNameSearch.val("cali");

// ** Submit the form
Document searchResults = form.submit().cookies(resp.cookies()).post();

// * Extract results (entity numbers in this sample code)
for (Element entityNumber : searchResults.select("table[id$=SearchResults_Corp] > tbody > tr > td:first-of-type:not(td[colspan=5])")) {
    System.out.println(entityNumber.text());
}

public static void checkElement(String name, Element elem) {
    if (elem == null) {
        throw new RuntimeException("Unable to find " + name);
    }
}

输出(截至撰写本文时)

C3036475
C3027305
C3236514
C3027304
C3034012
C3035110
C3028330
C3035378
C3124793
C3734637

也可以看看:

在此示例中,我们将使用FormElement类登录GitHub网站。

// # Constants used in this example
final String USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36"; 
final String LOGIN_FORM_URL = "https://github.com/login";
final String USERNAME = "yourUsername";  
final String PASSWORD = "yourPassword";

// # Go to login page
Connection.Response loginFormResponse = Jsoup.connect(LOGIN_FORM_URL)
                                             .method(Connection.Method.GET)
                                             .userAgent(USER_AGENT)
                                             .execute();

// # Fill the login form
// ## Find the form first...
FormElement loginForm = (FormElement)loginFormResponse.parse()
                                         .select("div#login > form").first();
checkElement("Login Form", loginForm);

// ## ... then "type" the username ...
Element loginField = loginForm.select("#login_field").first();
checkElement("Login Field", loginField);
loginField.val(USERNAME);

// ## ... and "type" the password
Element passwordField = loginForm.select("#password").first();
checkElement("Password Field", passwordField);
passwordField.val(PASSWORD);


// # Now send the form for login
Connection.Response loginActionResponse = loginForm.submit()
         .cookies(loginFormResponse.cookies())
         .userAgent(USER_AGENT)  
         .execute();

System.out.println(loginActionResponse.parse().html());

public static void checkElement(String name, Element elem) {
    if (elem == null) {
        throw new RuntimeException("Unable to find " + name);
    }
}

所有表单数据都由FormElement类为我们处理(甚至包括表单方法检测)。调用FormElement#submit方法时,将建立一个现成的Connection。我们要做的就是用附加头(cookie,用户代理等)完成此连接并执行它。



 类似资料:
  • 我创建一个列表,如下所示: 然后,我想在第一个子列表中插入10个,如下所示: 但是,我得到以下错误: 线程“main”java中出现异常。lang.IndexOutOfBoundsException:java中的索引:0,大小:0。util。ArrayList。java上的rangeCheck(ArrayList.java:653)。util。ArrayList。get(ArrayList.jav

  • 代码: 这段代码没有异常,一切似乎都很好,但是如果我打开填充的pdf,Adobe Reader会说这样的话: 此文档启用了扩展功能。此文档自创建以来已更改,无法再使用扩展功能。 有些字段填写正确,但我无法编辑。某些字段为空。若我通过单击Adobe Reader中的“导入数据”手动选择xml,则表单填写正确,所以我猜xml中并没有错误。

  • 问题内容: 我正在尝试使用jsoup解析HTML。这是我第一次使用jsoup,并且我也阅读了有关它的一些教程。以下是我要解析的HTML表- 如果您看到我的下表,则它现在有3个(我只是为了理解目的将其缩短为3个表行,但总的来说会更多)。现在,我想从我的下表中提取出它的对应信息,例如-我将提取其群集状态及其状态为关闭的所有主机名。 正如你可以看到下面的群集名称,我有两个主机名和其地位,但地位。 因此,

  • 正如您在下面看到的集群名称,我有两个主机名和,其中状态为,但状态为。 因此,我将打印作为集群名,并打印作为主机名,因为它已关闭。使用JSOUP可以做到这一点吗? 到目前为止,我能够使用jsoup提取整个HTML表,但不确定如何提取集群名和主机名- 更新:- 表中可能有两个集群名称,如下所示- 现在,如果您看到上面,我有两个集群名称--一个是,另一个是,所以我想找到所有仅为集群名称关闭的计算机。

  • 我在页面上有一个表单,用户可以在其中保存信息,还有一个下拉列表,可以从保存文件的目录中提取这些保存的文件。我想要的是当他们进入该页面时,当他们从下拉框中选择文件名时,它会将文件名放在输入框“CodeDescription”字段中,并将文件信息放在文本区域“Code”中,但我不确定如何解析该文件。下面是我当前的代码。 或者,相反地,我不介意在下拉菜单中选择正确的文件时,它只是在表单字段下面显示输出。

  • 我正在尝试将POJO的jackson JSON字符串转换为JSON文件以导入MySQL。 我遇到的问题是,即使我在控制台中返回了JSON字符串,并且。json文件创建后,MySQL workbench抛出一个未处理的错误异常:bool()类型的对象没有长度 作为一个json文件,行为“true”。 如果我做文件被正确导入,但数据库中没有数据,如果被视为json,则只有一行。 我的POJO