【发布时间】: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并查看您真正从服务器获得了什么以及是否有<div id="insideScroll"...>元素。如果没有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