【问题标题】:No output for parsing google news content没有用于解析谷歌新闻内容的输出
【发布时间】:2017-01-11 04:51:19
【问题描述】:

对于我的代码,我想获取 google 新的搜索标题和 URL。

过去可以。但是,我不知道为什么它现在不工作了?

Google 是改变了它的 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);
        }
    }

【问题讨论】:

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


    【解决方案1】:

    如果问题是“如何让代码再次运行?” 除非保存一份副本,否则任何人都很难知道旧页面的外观。

    我这样分解了你的选择,它对我有用。

        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/

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

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

    这是在 2016 年 5 月 30 日至 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

    【讨论】:

    • 有效!还有一个问题。如何在特定的时间范围内获取新闻,例如一年、三年还是五年?谢谢
    • 更新了解释时间范围参数的答案
    【解决方案2】:

    以下对我有用。请注意模式".g .r&gt;a" - 查找类g 的元素 >>> 类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 在具有“body”类的块下的任意位置查找 p 个元素

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

    虽然该解决方案有效,但我想可能不建议使用相同的解决方案,除非这是出于学习目的或临时使用。当 Google 更改其页面呈现时,将其作为产品的一部分提供可能会导致失败。

    【讨论】:

    • 解决了,你知道如何将日期范围设置为 2016/1/1 到 2016/1/12 并转到谷歌搜索结果的每一页
    • 在 Google 上运行搜索给了我 URL 模式 ?q=stackoverflow&tbs=cdr:1,cd_min:1/1/2016,cd_max:12/1/2016&tbm=nws 将帮助您实现这一目标。您能否接受答案,因为它已经解决了您的问题?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多