【问题标题】:Android: Extracting html sourceAndroid:提取html源
【发布时间】:2011-12-28 07:33:42
【问题描述】:

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

对不起,如果我遗漏了什么;我是新来的。提前感谢您的帮助。

编辑

我发现了一个不同的 URL,每个用户都不同,但是还有一个(另一个)相关的问题: 使用jsoup,我可以做 Jsoup.connect("http://www.stackoverflow.com/").get().html(); (将 URL 替换为我要访问的内容),这实际上得到了 HTML 源代码,但问题再次出现,当我尝试访问受用户/密码保护的网站时,它会要求提供登录信息。我需要能够输入用户名和密码一次,并且基本上将其存储在某种临时事物(cookies/cache?)中,并保留该信息以供 jsoup 停止查询登录凭据,每次我基于某个请求请求来源时网址。我仍然找不到解决此问题的方法...

【问题讨论】:

    标签: java android html webview


    【解决方案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 客户端是 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 的部分。

    看看什么对你有用。

    干杯, 尤金。

    【讨论】:

    • 您的方法似乎在正确的轨道上,但让我感到困惑。鉴于这种情况,您是否可以提供一些关于如何获取网站 html 源代码的示例代码?
    • 我会尝试一下,然后告诉你。感谢您的回复!
    • 这个方法让我很困惑;抱歉,我没有这方面的经验。我已经编辑了我的问题;你能看看吗?
    • 其中许多类没有出现在我的 java IDE 中(例如 PostMethod)...您能提出一个理由吗?
    • 好吧,因为方法没有显示出来,这是因为 Eclipse 看不到它们。您是否使用 maven 来构建您的项目?或不?如果不是,您应该查阅 Eclipse 文档,了解如何将类添加到类路径(右键单击项目 --> 构建路径 ....)。 jsoup 是我没有用过的东西,所以不能真正提出任何建议。
    【解决方案2】:

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

    或查看示例代码

    如何读取 URL 的内容

    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();
            }
    

    【讨论】:

    • 我可能是因为早上心情比较慢,但是你是怎么解决答案中的这部分的:“它显示相同的URL(但是,当然,要提取的信息是基于不同的用户”。您所呈现的只是简单地阅读 URL 的内容,恕我直言,您根本没有回答问题
    • 是的,尤金,我完全同意。我知道如何读取纯 URL 的内容,但这里的情况不同。
    猜你喜欢
    • 2016-04-08
    • 2020-08-07
    • 1970-01-01
    • 1970-01-01
    • 2012-06-07
    • 1970-01-01
    • 1970-01-01
    • 2013-05-01
    • 1970-01-01
    相关资源
    最近更新 更多