我在Android Studio中编码,我需要从特定网页获取并显示特定的数据行

use*_*831 2 html java parsing android jsoup

我是Java/Android Studio编码的新手.到目前为止,我已经能够找到所有设置.我有一个按钮,我需要将代码放在按钮单击事件中,该事件将从网站获取信息,将其转换为字符串并显示它.我想我必须使用html源代码才能做到这一点,所以我安装了Jsoup html解析器.我发现Jsoup的所有帮助只能让我把HTML变成"文档".而且我不确定这是否是实现我需要的最佳方式.任何人都可以告诉我用什么代码从网站上获取html代码,然后通过html搜索寻找特定的匹配,并将该匹配转换为字符串.或者任何人都可以告诉我是否有更好的方法来做到这一点.

这是包含我想要的值的html代码:

writeBidRow('Wheat', - 60,false,false,false,0.5,'01/15/2015','02/26/2015','All','','',60,'even',' c = 2246&l = 3519&d = G15',引号['KEH15'],0-0);

我需要在那个html代码中抓取并显示代表引号['KEH15']的任何值.预先感谢您的帮助.

基思

Cal*_*len 5

从您改变HTML的任何地方获取信息的情况下,抓取原始HTML是一种非常繁琐的方式来访问网络信息,不良做法和难以维护.

我不知道您的具体情况以及您要提取的数据,但如果您有其他方式通过API获取该数据,请使用它.

既然你说你是Android和Java的新手,让我解释一下我希望很早就向我解释过的东西(虽然我大多是自学成才).

人们通过互联网访问信息的方式传统上是通过HTML和JavaScript(您的浏览器解释为Chrome或Firefox看起来很漂亮),这些信息通过互联网使用HTTP协议进行传输.这是人类与远处的计算机进行通信的好方法,普通人可能没有意识到互联网上有更多的东西 - 您的浏览器和您可以访问的网站.

虽然有多种方法,但就我认为您正在寻找的目的而言,应用程序通过互联网进行通信的方式略有不同:

当一个Android应用程序向服务器询问某些信息,而不是返回供人类使用的HTML和JavaScript时,服务器将(传统上)返回所谓的JSON(或者有时是非常相似的XML).JSON是一种非常简单的方法,可以获取有关对象的信息,并将其放入人类(开发人员)和计算机可轻松读取的表单中,并且可以通过Internet轻松传输.例如,假设您要求服务器为播放视频的应用程序提供某种"视频"对象,它可能会给您这样的内容:

{
  "name": "Gangnam Style",
  "metadata": {
    "url": "https://www.youtube.com/watch?v=9bZkp7q19f0",
    "views": 2000000000,
    "ageRestricted": false,
    "likes": 43434
    "dislikes":124
  },
  "comments": [
    {
      "username": "John",
      "comment": "10/10 would watch again"
    },
    {
      "username": "Jane",
      "number": "12/10 with rice"
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

这对我们人类来说非常易读,也可以通过计算机实现!我们知道这个名字是"江南风格",视频的链接等.

在Java和Android中与JSON交互的一种非常有用的方式是Google的GSON库,它允许您将Java对象转换为JSON或将JSON对象解析为Java对象.

要获得此信息,您必须对API,应用程序编程接口进行网络调用.这只是服务器和客户端之间通信的一个奇特术语.我将在本例中使用的一个非常酷,免费且易于理解的API是OMDB API,它只是从IMDB中回放有关电影的信息.那么你如何与API交谈?幸运的是,他们有一些很好的文档,其中说要获取有关电影的信息,我们需要在网址中使用一些参数,例如

http://www.omdbapi.com/?t=Interstellar
Run Code Online (Sandbox Code Playgroud)

他们想要一个带参数"t"的标题.我们可以放一年,或返回类型,但这应该是很好的理解基础知识.如果您在浏览器中转到该URL,它会以JSON形式回传有关Interstellar的大量信息.我们在谈论的东西!那么如何从Android应用程序中获取此信息?

好吧,您可以使用Android内置的HttpUrlConnection类,并研究几个小时的电话无法正常工作的原因.但基本上每个应用程序现在都不使用网络?为什么重新发明轮子几乎每个有价值的应用程序可能以前都做过这项工作?也许我们可以在网上找到一些代码来为我们做这项工作.

或者甚至更好,一个图书馆!特别是由Square开发的开源库,改造.有很多类似的库(继续研究,最好找到最适合你的项目),但他们的想法是他们为低级网络编程做了所有艰苦的工作.按照他们的指南,您可以将大量代码工作减少到几行.因此,对于我们的OMDB API示例,我们可以像这样设置网络调用:

//OMDB API
public ApiClient{
    //an instance of this client object
    private static OmdbApiInterface sOmdbApiInterface;
    //if the omdbApiInterface object has been instantiated, return it, but if not, build it then return it.
    public static OmdbApiInterface getOmdbApiClient() {
        if (sOmdbApiInterface == null) {
            RestAdapter restAdapter = new RestAdapter.Builder()
                    .setEndpoint("http://www.omdbapi.com")
                    .build();
            sOmdbApiInterface = restAdapter.create(OmdbApiInterface.class);
        }
        return sOmdbApiInterface;
    }
    public interface OmdbApiInterface {
        @GET("/")
        void getInfo(@Query("t") String title, Callback<JsonObject> callback);

    }
}
Run Code Online (Sandbox Code Playgroud)

在您使用他们的文档研究和了解正在发生的事情之后,我们现在可以使用我们在您的应用程序中的任何位置设置的这个类来调用API:

//you could get a user input string and pass it in as movieName
ApiClient.getOmdbApiClient().getInfo(movieName, new Callback<List<MovieInfo>>() {
//the nice thing here is that RetroFit deals with the JSON for you, so you can just get information right here from the JSON object
            @Override
            public void success(JsonObject movies, Response response) {
                Log.i("TAG","Movie name is " + movies.getString("Title");
            }

            @Override
            public void failure(RetrofitError error) {
                Log.e("TAG", error.getMessage());
            }
        });
Run Code Online (Sandbox Code Playgroud)

现在,您已经进行了API调用,以便从整个网络获取信息!恭喜!现在用数据做你想做的事.在这种情况下,我们使用了Omdb,但您可以使用任何具有此通信方法的东西.出于您的目的,我不确切地知道您想要获得哪些数据,但是如果可能的话,尝试找到一个公共API或者您可以使用类似于此的方法获取它.

如果您有任何疑问,请告诉我.

干杯!