如何使用Jsoup从Android中的多个相关网页中提取数据?

时间:2015-07-18 00:31:09

标签: android jsoup web-scraping

好吧,我一直在应用程序中显示来自网站的新闻标题和内容http://www.myagdikali.com

我可以从'myagdikali.com/category/news/national-news/'中提取数据,但此页面中只有10个帖子,其他页面的链接为1,2,3 ...比如myagdikali.com/category/news/national-news/page/2。

我需要知道的是,如何从/ national_news下的每个可能页面中提取新闻?甚至可以使用Jsoup吗?

到目前为止,我从单个页面提取数据的代码是:

public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.fragment_all, container, false);
    int i = getArguments().getInt(NEWS);
    String topics = getResources().getStringArray(R.array.topics)[i];

    switch (i) {
        case 0:
            url = "http://myagdikali.com/category/news/national-news";
            new NewsExtractor().execute();

            break;
            .....


[EDIT]
private class NewsExtractor extends AsyncTask<Void, Void, Void> {
   String title;

@Override
protected Void doInBackground(Void... params) {

    while (status == OK) {
        currentURL = url + String.valueOf(page);


        try {
            response = Jsoup.connect(currentURL).execute();
            status = response.statusCode();
            if (status == OK) {

                Document doc = response.parse();
                Elements urlLists = doc.select("a[rel=bookmark]");
                for (org.jsoup.nodes.Element urlList : urlLists) {

                    String src = urlList.text();

                    myLinks.add(src);

                }
                title = doc.title();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    page++;

    }
    return null;




}

修改 在尝试从没有循环的单个页面提取数据时,我可以提取数据。但是在使用while循环之后,我得到错误,声明没有附加适配器。

实际上我在RecyclerView中加载提取的数据,onPostExecute就像这样:

    @Override
    protected void onPostExecute(Void aVoid) {
        layoutManager = new LinearLayoutManager(getActivity());
        recyclerView.setLayoutManager(layoutManager);

        myRecyclerViewAdapter = new     MyRecyclerViewAdapter(getActivity(),myLinks);
        recyclerView.setAdapter(myRecyclerViewAdapter);


    }

1 个答案:

答案 0 :(得分:0)

由于您知道所需页面的URL - http://myagdikali.com/category/news/national-news/page/X(其中X是介于2和446之间的页码),因此您可以遍历URL。您还需要使用Jsoup的response,以确保页面存在(可以更改数字446 - 我相信它会增加)。
代码应该是这样的:

final String URL = "http://myagdikali.com/category/news/national-news/page/";
final int OK = 200;
String currentURL;
int page = 2;
int status = OK;
Connection.Response response = null;
Document doc = null;

while (status == OK) {
    currentURL = URL + String.valueOf(page);  //add the page number to the url
    response = Jsoup.connect(currentURL)
            .userAgent("Mozilla/5.0")
            .execute();  //you may add here userAgent/timeout etc.
    status = response.statusCode();
    if (status == OK) {
        doc = response.parse();
        //extract the info. you need
    }
    page++;
}

这当然不是完全正常工作的代码 - 您必须添加try-catch句子,但编译器会帮助您。 希望这会对你有所帮助。

修改
1.我编写了代码 - 我必须发送一个userAgent字符串才能从服务器获得响应。
2.代码在我的机器上运行,它会打印很多????,因为我没有安装正确的字体 3.您收到的错误来自Android部分 - 与您的view有关。你没有发布那段代码......
4.尝试添加userAgent,它可以解决它 5.请通过编辑将错误和您运行的代码添加到原始问题中,它更具可读性。