没有解析谷歌新闻内容的输出

时间:2017-01-11 04:51:19

标签: java parsing jsoup google-search google-search-api

对于我的代码,我想获得谷歌新的搜索标题&网址。

它过去有效。但是,我不知道为什么它现在不起作用了?

谷歌改变了CSS结构还是什么?

由于

   public static void main(String[] args) throws UnsupportedEncodingException, IOException {

        String google = "http://www.google.com/search?q=";

        String search = "stackoverflow";

        String charset = "UTF-8";

        String news="&tbm=nws";


        String userAgent = "ExampleBot 1.0 (+http://example.com/bot)"; // Change this to your company's name and bot homepage!

        Elements links = Jsoup.connect(google + URLEncoder.encode(search , charset) + news).userAgent(userAgent).get().select( ".g>.r>.a");

        for (Element link : links) {
            String title = link.text();
            String url = link.absUrl("href"); // Google returns URLs in format "http://www.google.com/url?q=<url>&sa=U&ei=<someKey>".
            url = URLDecoder.decode(url.substring(url.indexOf('=') + 1, url.indexOf('&')), "UTF-8");

            if (!url.startsWith("http")) {
                continue; // Ads/news/etc.
            }
            System.out.println("Title: " + title);
            System.out.println("URL: " + url);
        }
    }

2 个答案:

答案 0 :(得分:3)

如果问题是&#34;我如何让代码再次运行?&#34; 除非他们保存了副本,否则任何人都很难知道旧页面的样子。

我打破了你的选择,这对我有用。

    String string = google + URLEncoder.encode(search , charset) + news;
    Document document = Jsoup.connect(string).userAgent(userAgent).get();
    Elements links = document.select( ".r>a");

当前页面源看起来像

       <div class="g">
        <table>
         <tbody>
          <tr>
           <td valign="top" style="width:516px"><h3 class="r"><a href="/url?q=https://www.bleepingcomputer.com/news/security/marlboro-ransomware-defeated-in-one-day/&amp;sa=U&amp;ved=0ahUKEwis77iq7cDRAhXI7IMKHUAoDs0QqQIIFCgAMAE&amp;usg=AFQjCNFFx-sJdU814auBfquRYSsct2c8WA">Marlboro Ransomware Defeated in One Day</a></h3>

结果: 标题:万宝路勒索软件在一天内被击败 网址:https://www.bleepingcomputer.com/news/security/marlboro-ransomware-defeated-in-one-day/

标题:Stack Overflow为开发人员提供了新的简历 网址:https://techcrunch.com/2016/10/11/stack-overflow-puts-a-new-spin-on-resumes-for-developers/

已编辑 - 时间范围 这些网址参数看起来很糟糕 添加后缀&amp; tbs = cdr%3A1%2Ccd_min%3A5%2F30%2F2016%2Ccd_max%3A6%2F30%2F2016

但是这部分&#34; min%3A5%2F30%2F2016&#34;包含您的最短日期。 2016年5月30日。 min%3A +(一年中的月份)+%2F +(月中的一天)+%2F +年份 在&#34; max%3A6%2F30%2F2016&#34;是你的最大日期。 2016年6月30日。 最大%3A +(一年中的月份)+%2F +(月中的一天)+%2F +年

这是在05/30/2016和2016年6月30日之间搜索Mindy Kaling的完整网址 https://www.google.com/search?tbm=nws&q=mindy%20kaling&tbs=cdr%3A1%2Ccd_min%3A5%2F30%2F2016%2Ccd_max%3A6%2F30%2F2016

答案 1 :(得分:2)

以下为我工作。请注意模式".g .r>a" - 查找包含课程g&gt;&gt;&gt;的元素类r内的所有元素都会立即以标记a

下降
Elements links = Jsoup.connect(google + URLEncoder.encode(search , charset) + news)
    .userAgent(userAgent).get().select( ".g .r>a");

来自documentation

  

.class:按类名查找元素,例如.masthead

     

ancestor child:从祖先下降的子元素,例如.body p在类&#34; body&#34;

的块下的任何位置找到p个元素      

parent > child:直接从父级下降的子元素,例如div.content&gt; p找到p个元素;和身体&gt; *找到身体标签的直接孩子

虽然解决方案有效,但我认为可能不建议依赖相同的解决方案,除非这是出于研究目的或临时使用。将此作为产品的一部分运送可能会在Google更改其页面呈现时导致失败。