Android:提取html源代码

时间:2011-12-28 07:33:42

标签: java android html webview

我正在尝试提取网站的来源,我已经研究了一下,许多解决方案指向使用HTTPClient和HTTPContext,但问题是我无法使用URL来获取此源。我使用的网站基于登录,无论您登录的是谁,它都会显示相同的URL(但当然,要提取的信息因用户而异)。因此,我想知道是否有办法直接从webview或类似的东西获取源代码。总之,我不能使用URL中间,因为它是统一的,基本上重定向到一般的登录页面。

抱歉,如果我遗失了什么;我是新来的。感谢您的帮助。

编辑

我找到了一个与用户不同的差异化网址 ,但有一个(其他)相关问题:    使用jsoup,我可以做Jsoup.connect(“http://www.stackoverflow.com/”)。get()。html(); (将URL替换为我正在尝试访问的内容)这确实得到了HTML源代码,但问题再次出现时,当我尝试访问受用户/密码保护的网站时,它会要求登录信息。我需要能够输入一次用户名和密码,并且基本上将其存储在某种临时的东西(cookies / cache?)中并保留jsoup的信息,以便每当我根据某个请求源时停止查询登录凭据URL。我仍然无法找到解决这个问题的方法......

2 个答案:

答案 0 :(得分:1)

如果我理解正确(如果我没有,请告诉我):

如果用户/密码受到保护,您是否应该发出Http Post(例如您从浏览器中执行的操作)并从该帖子获取响应?像这样:

http://www.informit.com/guides/content.aspx?g=java&seqNum=44

编辑:这是一个示例

我有一个看起来像这样的页面(它过于简单了,但不过就是这样):

<form action="../../j_spring_security_check" method="post" >
        <input id="j_username" name="j_username" type="text" />
            <input id="j_password" name="j_password" type="password"/>
                    <input type="image" class="submit" id="login" name="login" />
</form>

如果它是一个网页,您必须提供用户名/密码才能在此登录页面之后“获取”实际内容。你真正发出的是这里的HTTP POST(我打赌你的情况也一样)。

现在以编程方式获得相同的功能......

你需要apache http客户端库(你可能没有它,但这是一种简单的方法)。这是它的maven依赖。你是为Android而去,对吗? apache http client是我读过的Android中的默认设置。

<dependency>
<groupId>commons-httpclient</groupId>
<artifactId>commons-httpclient</artifactId>
<version>3.1</version>

import org.apache.commons.httpclient.Header;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.methods.PostMethod;

public class HttpPost {
    public static void main(String[] args) {

        HttpClient httpClient = new HttpClient();
        PostMethod postMethod = new PostMethod("http://localhost:20000/moika/moika/j_spring_security_check");
        postMethod.addParameter("j_username", "ACTUAL_USER");
        postMethod.addParameter("j_password", "ACTUAL_PASSWORD");

        try {
            int status = httpClient.executeMethod(postMethod);
            System.out.println("STATUS-->" + status);

            if(status == 302){
                Header header = postMethod.getResponseHeader("location");
                String location = header.getValue();
                System.out.println("HEADER_VALUE-->" + location);
                GetMethod getMethod = new GetMethod(location);
                httpClient.executeMethod(getMethod);
                String content = getMethod.getResponseBodyAsString();
                System.out.println("CONTENT-->" + content);
            }

            String contentInCaseOfNoRedirect = postMethod.getResponseBodyAsString();

        } catch (Exception exception){
            exception.printStackTrace();
        }
    }
}

这可能看起来很奇怪,但是我执行了重定向(302),在RCF中似乎存在问题,因此这是一个小问题。

如果您没有在服务器端执行任何重定向,那么您可以忽略我检查302的部分。

看看什么对你有用。

干杯, 尤金。

答案 1 :(得分:0)

请参阅http://docs.oracle.com/javase/tutorial/networking/urls/readingWriting.html

或查看示例代码

如何阅读网址内容

try{
        URL oracle = new URL("http://www.w3schools.com/html/html_tables.asp");
        URLConnection yc = oracle.openConnection();
        InputStream is = yc.getInputStream();
        String inputLine;
        BufferedReader in = new BufferedReader(
                new InputStreamReader(
                yc.getInputStream()));
        while ((inputLine = in.readLine()) != null) 
            System.out.println(inputLine);
        in.close();

        }catch(Exception ex){
            ex.printStackTrace();
        }