【问题标题】:JSoup Extract title from img classJSoup 从 img 类中提取标题
【发布时间】:2017-01-10 18:31:33
【问题描述】:

我正在使用 JSoup 构建一个网络爬虫。我正在尝试从下面的 HTML 代码中提取 img 类的标题。

<div id="insideScroll" class="grid slider desktop-view">
    <ul class="ng-scope" ng-if="2 === selectedCategoryId">
      <li class="" data-list-item="">
          <span>
              <a class="grid-col--subnav ng-isolate-scope" data-internal-referrer-link="hub nav" data-link-name="hub nav daughter" data-click-id="hub nav 2" href="/recipes/111/appetizers-and-snacks/beans-and-peas/?internalSource=hub nav&referringId=76&referringContentType=recipe hub&linkName=hub nav daughter&clickId=hub nav 2" target="_self">
                  <img class="" alt="Bean and Pea Appetizers" title="Bean and Pea Appetizers" src="http://images.media-allrecipes.com/userphotos/140x140/00/60/91/609167.jpg">
                  <span class="category-title">Bean and Pea Appetizers</span>
              </a>
         </span>
     </li>
</div>

这是我所拥有的功能,但它似乎不起作用。我在运行它时收到空指针异常,从堆栈跟踪中我假设这是由于图像类中缺少名称。我也可以从 span 类中提取标题,但也无法从中获取文本。感谢您的帮助。

@Override
public ArrayList<String> parseDocForTitles(Document doc) {
    ArrayList<String> titles = new ArrayList<>();
    String title;

    Element insideScroll = doc.getElementById("insideScroll");
    Elements img = insideScroll.select("img.\"\"");

    for(Element ttle : img){
        title = ttle.attr("title");
        out.println(title); //just for testing
        titles.add(title);
    }

    return titles;
}

下面是我收到的堆栈跟踪:

[-]ERROR: See Stack Trace
java.lang.NullPointerException
    at Scraper.Appetizers.parseDocForTitles(Appetizers.java:35)
    at Scraper.Driver.main(Driver.java:25)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)

【问题讨论】:

  • 你能把错误贴出来吗!
  • 我发布了堆栈跟踪
  • 由于我无法重现此错误,因此您可能无法解析预期的内容。如果该 HTML 结构的某些部分是由浏览器生成的(在 JavaScript 的帮助下),那么它很可能不会是从您正在解析的服务器发送给您的 HTML 响应的一部分。尝试打印doc 并查看您真正从服务器获得了什么以及是否有&lt;div id="insideScroll"...&gt; 元素。如果没有Element insideScroll = doc.getElementById("insideScroll");,则将null 分配给insideScroll。在下一行中,insideScroll.select 将与提供 NPE 的 null.select 相同。
  • 这一理论似乎得到了事实的证实,即您没有看到由select("img.\"\"") 引起的IllegalArgumentException: String must not be empty 异常。如果您想选择具有空类的元素,请查看以下问题:How to select Element with empty class using Jsoup

标签: java web-scraping jsoup


【解决方案1】:

这对我有用:

Document document; 
try { //Get Document object after parsing the html from given url. 
    document = Jsoup.connect(yourURL).get();   
    //Get images from document object. 
    Elements images = document.select("img[src~=(?i)\\.(png|jpe?g|gif)]");   
    //Iterate images and print image attributes. 
    for (Element image : images) { 
        System.out.println("Image Source: " + image.attr("title"));
    }   
} catch (IOException e) { 
    e.printStackTrace(); 
}   

【讨论】:

    【解决方案2】:

    你只需要正确选择img元素。

    改变这个:

    Elements img = insideScroll.select("img.\"\"");
    

    对此:

    Elements img = insideScroll.select("img");
    

    它应该可以工作。

    【讨论】:

    • 我仍然收到空指针异常。它说异常是从这一行引发的Elements img = insideScroll.select("img");
    • 那么它一定来自你的另一段代码。我能够使用提供的 html 运行该方法,并获得了 img 的标题。究竟是哪一行生成了空指针?
    • 堆栈跟踪显示第 35 行是 Elements img = insideScroll.select("img");
    • 好的,如果抛出空指针,这意味着Element insideScroll = doc.getElementById("insideScroll"); 是空的部分。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 2018-09-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多