【问题标题】:Android: retrieve information from an internet site [closed]Android:从互联网站点检索信息[关闭]
【发布时间】:2014-07-05 18:50:06
【问题描述】:

我的目标是从Wall Street Journal 网站(http://online.wsj.com/home-page) 中检索标题,然后按一下按钮将其放入我的应用程序中。这是我到目前为止所做的:

public class NewsFeed extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstasnceState);
        setContentView(R.layout.activity_newsfeed);

        HttpGet httpGet = new HttpGet('http://online.wsj.com/home-page');
        final String headline = String.valueOf(httpGet);

        button1.setOnClickListener (new View.OnClickListener() {
            @Override
            public void onClick (View v) {
                textview1.setText(headline);
            }
       });

    }

}

如何更改我的代码以正确显示网站信息?

【问题讨论】:

  • 使用线程或异步任务并使用像jsoup这样的html解析器来显示标签的内容
  • 这个问题相当广泛——你基本上需要下载页面然后解析它,但这在很大程度上取决于你想要实现的目标,例如你想提取什么信息(标题、摘要?),你想如何显示它,&c。请提供更多信息(例如,关于您遇到的具体问题),您可能会得到很好的答案。

标签: java android


【解决方案1】:

首先您需要下载 HTML。您可以使用名为 AsyncHttpClient http://loopj.com/android-async-http/的框架来完成此操作

然后你需要解析 HTML Headline,应该是类似于 h1 的内容,因此你需要一个 HTML Parser,比如http://jsoup.org/

【讨论】:

    【解决方案2】:

    如果您只是将 URI 传递给 HttpGet,则无法获取响应字符串。您可以参考以下 stackoverflow URL 来了解如何使用 HttpGet 和检索响应: How do I use the Simple HTTP client in Android?

    此外,如果您在主 UI 线程上执行任何长时间运行的操作,可能会导致 ANR。因此,为了避免在单独的线程、Executor 等中执行此操作。您可以使用 IntentService 或 AsyncTask 或带有线程的服务。否则,一种简单的方法是使用任何第三方库,如 Volley、Facebook Bolt 等。

    【讨论】:

      【解决方案3】:

      要么像麻婆说的那样使用http://loopj.com/android-async-http/,或者如果你觉得它太复杂,使用https://code.google.com/p/android-query/

      我会选择第一个,因为它支持更多,重试等。 如果您想要图片、facebook / twitter 集成等,Android Query 非常好

      【讨论】:

        【解决方案4】:

        这是一个没有任何外部库的简单概念证明:

                new AsyncTask<String, Integer, String>(){
        
                @Override
                protected String doInBackground(String... params) {
                    try {
                        // get HTTP Data
                        HttpClient client = new DefaultHttpClient();
                        HttpResponse response = client.execute(new HttpGet(params[0])); // We only support the first param 
                        String html = EntityUtils.toString(response.getEntity());
        
                        Matcher m = Pattern.compile("<title>(.*?)</title>").matcher(html);
                        if(m.find()){
                            Log.i("HeadLine", m.group(1));
                            return m.group(1);
                        }
        
                    } catch (Exception e) {
                        Log.e("e", e.getMessage(),e);
                    }
        
                    // nothing found or an exception occurred
                    return null;
                }
                @Override
                protected void onPostExecute(String result) {
                    // update your view with the value
                    super.onPostExecute(result);
                }
        
            }.execute("http://online.wsj.com/home-page");
        

        你一定要弄清楚细节,但我相信你可以自己做。

        【讨论】:

          【解决方案5】:

          如下获取relevant feedparse it

          URL url = new URL("http://example.com/feed.rss");
          RssFeed feed = RssReader.read(url);
          
          ArrayList<RssItem> rssItems = feed.getRssItems();
          for(RssItem rssItem : rssItems) {
              Log.i("RSS Reader", rssItem.getTitle());
          }
          

          使用 XML 而不是解析通常是混乱且容易更改的 HTML,它存在供您使用。

          【讨论】:

            【解决方案6】:

            您可以使用JSOUP

              //Get the HTML
              Document doc = Jsoup.connect("http://online.wsj.com/europe").get();
              //Get the Headlines
              Elements headlines = doc.select("h2.tipTarget");
            
              for (Element e : headlines) {
                 String headline = e.text();
            
              }
            

            为避免异常,您必须在其他线程中执行之前的代码。示例:

            protected void onCreate(Bundle savedInstanceState) {
                    super.onCreate(savedInstasnceState);
                    setContentView(R.layout.activity_newsfeed);
                    new GetHeadLines().execute();
            }
            
            
            private class GetHeadLines extends AsyncTask<Void, Void, Elements> {
            
                protected Elements doInBackground(Void... params) {
                  //Get the HTML
                  Document doc = Jsoup.connect("http://online.wsj.com/europe").get();
                  //Get the Headlines
                  Elements headlines = doc.select("h2.tipTarget");
            
                  return headlines;
             }
            
               protected void onPostExecute(Elements headlines) {
                    for (Element h : elements) {
                            String headline = h.text();
                            //Do stufs
                    }
                }
            }
            

            【讨论】:

              【解决方案7】:

              HTTPGet 只是一个对象,这就是您收到“神秘”消息的原因。你需要执行

              httpGet.getMethod();
              

              然后你得到一个字符串。你也应该看看HTTPGet APi

              【讨论】:

              • 使用 httpGet,您只能发出 get 请求 -> 您不会获得页面源代码。您需要将代码替换为 HttpGet getRequest = new HttpGet('online.wsj.com/home-page'); String getInfos = getRequest.getMethod();
              • 再次检查。 getMethod() 返回一个固定的字符串。它实际上并没有执行网络请求!
              【解决方案8】:

              你没有执行你的HttpGet

                      HttpClient httpclient = new DefaultHttpClient();
                      HttpGet method = new HttpGet("http://online.wsj.com/home-page");
                      HttpResponse response = httpclient.execute(method);
              

              也试试这个链接 - HttpClient.execute(HttpPost) on Android 4.2 error

              【讨论】:

              • 好的,我明天完全回答
              猜你喜欢
              • 2013-07-18
              • 2012-12-21
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2018-07-15
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多