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

在Java中解析HTML以获取Android应用

经慈
2023-03-14
问题内容

我正在编写一个Android应用,该应用从网站获取相关数据并将其呈现给用户(html抓取)。该应用程序下载源代码并对其进行解析,以查找要存储在对象中的相关数据。我实际上使用JSoup进行了解析器,但事实证明,这在我的应用程序中真的很慢。而且,这些库往往很大,我希望我的应用程序轻巧。

我要解析的网页都具有相似的结构,并且我确切地知道我要寻找的标签。因此,我认为我不如下载源代码并逐行阅读它,并使用查找相关数据String.equals。例如,如果html看起来像这样:

<textTag class="text">I want this text</textTag>

我会使用类似的方法来解析它:

private void interpretHtml(String s){
    if(s.startsWidth("<textTag class=\"text\"")){
        String text = s.substring(22, s.length() - 10);
    }
}

但是,我对建立连接知之甚少(我见过人们使用HttpGets,但我不确定如何从中获取数据)。我已经搜索了很多时间,以查找有关如何进行这种解析的信息,但是大多数人经常诉诸于使用诸如JSoup,SAX等库来进行解析。

是否有人碰巧知道如何进行这样的解析,也许是一个例子?还是以这种方式解析源代码是个坏主意?请给我您的意见。

感谢您的时间。


问题答案:

这是我要怎么做:

        StringBuffer text = new StringBuffer();
        HttpURLConnection conn = null;
        InputStreamReader in = null;
        BufferedReader buff = null;
        try {
            URL page = new URL(
                    "http://example.com/");
// URLEncoder.encode(someparameter); use when passing params that may contain symbols or spaces use URLEncoder to encode it and conver space to %20...etc other wise you will get a 404
            conn = (HttpURLConnection) page.openConnection();
            conn.connect();
            /* use this if you need to
            int responseCode = conn.getResponseCode();

            if (responseCode == 401 || responseCode == 403) {
                // Authorization Error
                Log.e(tag, "Authorization Error");
                throw new Exception("Authorization Error");
            }

            if (responseCode >= 500 && responseCode <= 504) {
                // Server Error
                Log.e(tag, "Internal Server Error");
                throw new Exception("Internal Server Error");
            }*/
            in = new InputStreamReader((InputStream) conn.getContent());
            buff = new BufferedReader(in);
            String line = "anything";
            while (line != null) {
                line = buff.readLine();
            String found = interpretHtml(line);
            if(null != found)
                return found; // comment the previous 2 lines and this one if u need to load the whole html document.
                text.append(line + "\n");
            }
        } catch (Exception e) {
            Log.e(Standards.tag,
                    "Exception while getting html from website, exception: "
                            + e.toString() + ", cause: " + e.getCause()
                            + ", message: " + e.getMessage());
        } finally {
            if (null != buff) {
                try {
                    buff.close();
                } catch (IOException e1) {
                }
                buff = null;
            }
            if (null != in) {
                try {
                    in.close();
                } catch (IOException e1) {
                }
                in = null;
            }
            if (null != conn) {
                conn.disconnect();
                conn = null;
            }
        }
        if (text.toString().length() > 0) {
            return interpretHtml(text.toString()); // use this if you don't need to load the whole page.
        } else return null;
    }

private String interpretHtml(String s){
    if(s.startsWidth("<textTag class=\"text\"")){
    return s.substring(22, s.length() - 10);
    }
    return null;
}


 类似资料:
  • 问题内容: 不使用任何外部库,将网站的HTML内容提取为String的最简单方法是什么? 问题答案: 我目前正在使用此: 但不确定是否有更好的方法。

  • 编辑: 大家好,我需要一些帮助。实际上,我想从url获取并使用一些有用的数据。我有一个网站,显示在特定地区的一些重大事故的信息。我想从那个网站上了解那些事故的详细情况。我将在Android MapView中显示它们,并带有接点。我该怎么做?我经历了这一切,但仍然无法做到这一点。

  • 问题内容: 我正在开发一个从网站上抓取数据的应用程序,我想知道应该如何获取数据。具体来说,我需要包含在使用特定CSS类的许多div标签中的数据-目前(出于测试目的)我只是在检查 在HTML的每一行中-都可以,但是我不禁感到有更好的解决方案。 有什么好方法可以给类添加一行HTML并提供一些好方法,例如: 问题答案: “ JTidy是HTML Tidy的Java端口,HTML Tidy是HTML语法检

  • 我正在尝试访问由Javascript创建的网页上的一些内容。然而,我希望访问的内容是在页面加载后由javascript创建的,因此当我尝试用Jsoup解析它时,无法找到这个Html源代码块。 我使用HtmlUnit获取Html源代码的代码如下: 但是当我运行它时,应该创建的Html没有被打印出来。我想知道如何获得这个由Javascript创建的Html源代码,使用HtmlUnit,然后获得所述结果

  • 我如何只在Javascript中获得每个对象的名称和值?

  • 我试图在这里使用JSOUP解析html标记。我对jsoup是新来的。基本上,我需要解析这些标记,获取这些标记中的文本,并应用class属性中提到的样式。 我正在创建一个SpannableStringBuilder,它可以创建子字符串,应用样式,并将它们附加到没有样式的文本中。 我不确定如何解析不在任何标记之间的字符串,例如“there are”和“worker from the”。 需要输出,例如