使用Jsoup提取HTML表格td内容中途终止,如何获取完整数据?
解决Jsoup爬取STEM SEVIS数据表格中途停止的问题
问题根源
你遇到的输出中途停止问题,核心原因有两个:
- 目标网页的表格数据量极大,控制台对单批次输出的文本长度有限制,直接打印大内容会触发输出中断
- Jsoup默认连接配置未适配大网页加载,可能出现网页内容加载不完整的情况
解决方案
1. 调整Jsoup连接参数
增加超时时间、取消内容大小限制,确保网页完整加载:
Document doc = Jsoup.connect("https://studyinthestates.dhs.gov/sevis-data-mapping-tool/september-2023-stem-sevis-data-mapping-tool-data") .timeout(10000) // 设置10秒超时阈值 .maxBodySize(0) // 取消响应内容大小限制 .get();
2. 替换输出方式
控制台无法高效处理超大量文本输出,改用文件写入能彻底避免中断问题,同时保留完整数据。
3. 优化代码逻辑
利用StringBuilder缓存数据,减少IO操作次数,提升处理效率。
修改后的完整代码
import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; import java.io.FileWriter; import java.io.IOException; public class myProjectDataExtracter { public static void main(String[] args) throws IOException { StringBuilder sb = new StringBuilder(); // 配置Jsoup连接,适配大网页加载 Document doc = Jsoup.connect("https://studyinthestates.dhs.gov/sevis-data-mapping-tool/september-2023-stem-sevis-data-mapping-tool-data") .timeout(10000) .maxBodySize(0) .get(); // 遍历表格行,缓存所有数据 for (Element table : doc.select("table")) { for (Element row : table.select("tr")) { Elements tds = row.select("td"); sb.append(tds.text()).append(System.lineSeparator()); } } // 将缓存数据写入文件 try (FileWriter myWriter = new FileWriter("sevis_stem_data.txt")) { myWriter.write(sb.toString()); } System.out.println("所有表格数据已完整写入sevis_stem_data.txt文件"); } }
额外说明
- 如果坚持需要控制台输出,建议每处理100-200行就打印一次缓存内容并清空StringBuilder,避免单条输出内容过长
- 目标网页数据量超10万行,控制台输出会非常缓慢且易卡顿,写入文件是更稳妥的选择
内容的提问来源于stack exchange,提问作者sam tada
相关产品推荐
相关产品推荐

