V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
tiRolin
V2EX  ›  Java

Jsoup 实现爬虫无法获取结点中的标签文本,求解

  •  
  •   tiRolin · 2023-03-19 05:28:54 +08:00 · 1007 次点击
    这是一个创建于 401 天前的主题,其中的信息可能已经有所发展或是发生改变。

    一个项目里需要实现 java 爬虫,爬取这个网站中的图片和标题

    通过 Xpath 语句 //div[contains(@class,"article-img")]很快就获取到了所需要的 Elements 对象,但奇怪的是 Elements 对象中有所需要的内容,打印也能正常展示,但是一旦遍历 Elements 尝试去获取标签属性就打印不出任何结果,调用获取所有属性方法并打印就只能打印出后两个我不需要的属性,但是前面打印的时候我需要的属性又还在

    代码如下

        @Override
        public R crawler() {
            try(WebClient webClient = WebClientUtils.getWebClient()){
                System.out.println("开始爬取.....");
    //            WebRequest webRequest = new WebRequest(new URL("https://www.cnhnb.com/xt/search/?%E6%9F%91%E6%A9%98%E5%87%A4%E8%9D%B6"), HttpMethod.GET);
    //            HtmlPage page = webClient.getPage(webRequest);
    //            Document document = Jsoup.parse(page.asXml());
                String url = "https://www.cnhnb.com/xt/search/?%E6%9F%91%E6%A9%98%E5%87%A4%E8%9D%B6";
                Document document = Jsoup.connect(url).get();
                Elements elements = document.selectXpath("//div[contains(@class,\"article-img\")]");
                System.out.println(elements.size()); //大小显示为 10
                System.out.println(elements.html()); //elements 有结果,能正确打印出内容
                for (Element element : elements) {
                    System.out.println(element.html());//能正确打印出内容,注释为打印结构
                    /*
                    <img alt="花椒凤蝶怎么防治?" src="//files.cnhnb.com/master-ssr/hammer/img/2a7149c.jpg" class="s-img-default" data-v-36fd24c6 data-v-1dc19fe0>
                     */
                    System.out.println(element.attr("alt")); //无内容
                    System.out.println(element.attr("src")); //无内容
                    Attributes attributes = element.attributes();
                    for (Attribute attribute : attributes) {
                        System.out.println(attribute.html()); //打印出后两个属性,注释为打印结果
                        /*
                        
    
                            class="article-img"
                            data-v-1dc19fe0
                         */
                    }
                }
            }catch (Exception e){
                e.printStackTrace();
            }
            return null;
        }
    

    我测试爬虫功能的方式开启项目之后打开本地 Swagger 并调用方法 这个问题我搞了两天都没有解决,去网上查也没看到谁有类似问题,和学长交流两三天了我啥方法都试过了也不行,实在没办法了我才来求教各位,来个大佬救救

    4 条回复    2023-03-22 23:56:20 +08:00
    seanzxx
        1
    seanzxx  
       2023-03-19 06:06:31 +08:00
    System.out.println(element.attr("alt")); //无内容
    System.out.println(element.attr("src")); //无内容

    你要明白现在的 Element 是什么内容?根据你的 xpath ,Element 其实是 div ,根本没有 alt 和 src 两个属性。
    你可以用 firstElementChild 定位到 img
    System.out.println(element.firstElementChild().attr("alt"));
    System.out.println(element.firstElementChild().attr("src"));

    本地测了一下,就可以打印出内容了
    tiRolin
        2
    tiRolin  
    OP
       2023-03-19 11:43:57 +08:00 via Android
    @seanzxx 谢谢你大佬,你的回复完美解决了我的问题,不过我还有一个问题想请教一下你,就是目前我获取到的图片属性总是这样的 //files.cnhnb.com/master-ssr/hammer/img/2a7149c.jpg ,这种无法正确加载图片,跟网页里看到的 URL 地址不一样,就我再来问你一下
    ALLROBOT
        3
    ALLROBOT  
       2023-03-20 08:03:21 +08:00
    可能是 js 动态加载?
    seanzxx
        4
    seanzxx  
       2023-03-22 23:56:20 +08:00
    @tiRolin 那个文件只是个占位符,真正的图片是由 js 加载的,你可以看页面里面的 js
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1117 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 18:32 · PVG 02:32 · LAX 11:32 · JFK 14:32
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.