Jsoup发布修改过的文档

时间:2012-01-24 12:14:22

标签: java screen-scraping jsoup

我正在尝试为即将推出的Android应用创建一个网络抓取工具。因此,我需要在网站上使用简单的搜索表单,填写并将结果发送回服务器。

Jsoup-Cookbook中所述,我从服务器上删除了我需要的网站并更改了值。

现在我只需要将修改后的文档发回服务器并抓取生成的页面。 就我在Jsoup-API中看到的那样,除了在Jsoup.connection中使用.data-Attribute之外,没有办法发回一些东西,遗憾的是,它不能用它们的id填写文本字段。

任何想法或解决方法,如何将修改后的文档或其部分发布回网站?

2 个答案:

答案 0 :(得分:4)

您似乎误解了HTTP的工作原理。具有修改的输入值的整个 HTML文档不是从客户端发送到服务器的。更重要的是,所有输入元素的name = value对都作为请求参数发送。然后服务器将返回所需的HTML响应。

例如,如果您想在Jsoup中模拟以下表单的提交(您可以通过在浏览器中打开带有表单的页面找到确切的HTML表单语法并右键单击查看源

<form method="post" action="http://example.com/somescript">
    <input type="text" name="text1" />
    <input type="text" name="text2" />
    <input type="hidden" name="hidden1" value="hidden1value" />
    <input type="submit" name="button1" value="Submit" />
    <input type="submit" name="button2" value="Other button" />
</form>

然后你需要按如下方式构建请求:

Document document = Jsoup.connect("http://example.com/somescript")
    .data("text1", "yourText1Value") // Fill the first input field.
    .data("text2", "yourText2Value") // Fill the second input field.
    .data("hidden1", "hidden1value") // You need to keep it unmodified!
    .data("button1", "Submit")       // This way the server knows which button was pressed.
    .post();

// ...

在某些情况下,您还需要重新发送会话cookie,但这是一个独立的主题(以及之前已经多次询问的问题;一般来说,使用真正的HTTP客户端更容易并通过Jsoup#parse())传递其回复。

另见:

答案 1 :(得分:0)

那不是那样的。您应该创建一个POST请求(使用Apache HTTP Components),获取响应,然后使用JSoup抓取它。