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

2023-03-19 05:28:54 +08:00
 tiRolin

一个项目里需要实现 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 并调用方法 这个问题我搞了两天都没有解决,去网上查也没看到谁有类似问题,和学长交流两三天了我啥方法都试过了也不行,实在没办法了我才来求教各位,来个大佬救救

1019 次点击
所在节点    Java
4 条回复
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
2023-03-19 11:43:57 +08:00
@seanzxx 谢谢你大佬,你的回复完美解决了我的问题,不过我还有一个问题想请教一下你,就是目前我获取到的图片属性总是这样的 //files.cnhnb.com/master-ssr/hammer/img/2a7149c.jpg ,这种无法正确加载图片,跟网页里看到的 URL 地址不一样,就我再来问你一下
ALLROBOT
2023-03-20 08:03:21 +08:00
可能是 js 动态加载?
seanzxx
2023-03-22 23:56:20 +08:00
@tiRolin 那个文件只是个占位符,真正的图片是由 js 加载的,你可以看页面里面的 js

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/925208

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX