我正在使用JSoup从HTML页面解析一堆XML链接。我连接到该页面,并为所有anchor
标签解析它,如下所示:
Document htmlDoc = null;
location = location.replace("\\", "/").replace("http:/", "http://") + "/";
try {
htmlDoc = Jsoup.connect(location).get();
} catch (IOException e) {
e.printStackTrace();
}
return htmlDoc.select("a");
它正在查找页面,并加载了一半<a>
标签,这些标签包含指向xml文档的链接。但出于某种原因,它的停止只有不到一半。当我使用IntelliJ并尝试查看列表中的最后一个xml链接时,我看到了:
但是,突出显示的<a>
标记显示在页面的一半下方,这意味着它只检索了大约一半的所需标记。值得注意的是,这个HTML页面很大,我期待返回大约9,000个<a>
个标签。目前我正在4383
。
这是JSoup的常见问题吗?是否有某种超时或内存上限?
修改
所以,我提取了我的程序从服务器上拉下来的纯HTML代码,这就是我所看到的:
<td valign="top"><img src="/icons/text.gif" alt="[TXT]" /></td>
<td><a href="IEHRES30J8M4_1378047310463.xml">IEHRES30J8M4_1378047310463.xml</a></td>
<td align="right">01-Sep-2013 15:55 </td>
</tr>
</tbody>
</table>
</body>
</html>
现在,这显示了所有必要的结束标记。它不只是停止标签的一半。如果内存不足,JSoup会整理HTML,或者它认为这是网页的整个内容?
进一步发行
我在maxBodySize
对象中找到了一个名为Jsoup.Connection
的方法。我将maxBodySize
设置为1048576 (10MB)
。正在检索的文件大小为4MB
,但这仍然无法解决问题。这是修改后的代码:
Document htmlDoc = null;
location = location.replace("\\", "/").replace("http:/", "http://") + "/";
try {
logger.info("Parsing XML Files from " + location);
Connection conn = Jsoup.connect(location);
conn.maxBodySize(1048576);
htmlDoc = conn.get();
} catch (IOException e) {
e.printStackTrace();
}
return htmlDoc.select("a");
答案 0 :(得分:3)
经过进一步检查后,我发现我的网页以两个增量加载。我想这是因为数据量庞大。我的jSoup
<a>
代码数组中的最后一个条目对应于页面第一个增量上的最后一个<a>
。
我通过使用此方法单独拉下HTML来解决这个问题:
private static String getHtml(String location) throws IOException {
URL url = new URL(location);
URLConnection conn = url.openConnection();
BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String input;
StringBuilder builder = new StringBuilder();
while((input = in.readLine()) != null)
{
builder.append(input);
}
return builder.toString();
}
然后在结果字符串上调用Jsoup.parse
方法。这意味着我拥有所有数据,它实际上提高了性能(虽然对于我的生活我不知道如何)。
答案 1 :(得分:1)
我用包含超过50.000(五万)的生成的HTML文件测试了jsoup 锚标签。
Jsoup完全解析了这些文件,并能够选择所有锚元素 和href属性正确...
因此,没有根本的问题。