如何将Jsoup解析HTML获取的数据正确导出保存为CSV文件
问题原因
- 没有拆分每行的独立单元格:
Element.text()会把当前<tr>标签下所有子元素的文本合并为一个用空格分隔的字符串,你没有单独提取每个<td>/<th>的内容,自然无法按列拆分 String.join用法不符合预期:你传入的第二个参数是单个字符串,无法完成多列内容的逗号拼接,该方法需要传入多个待拼接的字符串集合/数组
修正后可直接导出CSV的代码
首先补充必要的导入类(你已有的Jsoup相关导入可以保留):
import java.io.FileWriter; import java.io.IOException; import java.util.stream.Collectors;
核心逻辑代码:
public class UsMarketCrawler { public static void main(String[] args) throws IOException { Document document = Jsoup.connect("https://www.investing.com/markets/united-states").get(); Elements rows = document.select("tr"); // 初始化CSV文件写入器,指定输出文件路径为项目根目录的us_market_data.csv try (FileWriter csvWriter = new FileWriter("us_market_data.csv")) { rows.forEach(row -> { // 提取当前行下所有单元格的独立文本 Elements cells = row.select("td, th"); String csvRow = cells.stream() // 处理特殊字符,避免CSV格式错乱 .map(cell -> { String text = cell.text().trim(); // 内容包含逗号、双引号、换行时,用双引号包裹,内容中原有的双引号替换为两个双引号 if (text.contains(",") || text.contains("\"") || text.contains("\n")) { text = "\"" + text.replace("\"", "\"\"") + "\""; } return text; }) .collect(Collectors.joining(",")); // 写入行数据并换行 try { csvWriter.write(csvRow + "\n"); } catch (IOException e) { e.printStackTrace(); } // 控制台打印用于验证 System.out.println(csvRow); }); } } }
注意事项
- 代码运行成功后,会在项目根目录生成
us_market_data.csv文件,表格工具、文本编辑器都可以正常打开,行列自动对齐 - 如果遇到反爬拦截,可以给Jsoup请求添加User-Agent头,连接代码修改为如下即可:
Document document = Jsoup.connect("https://www.investing.com/markets/united-states") .userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36") .get();
内容的提问来源于stack exchange,提问作者Professional_Learner
相关产品推荐
相关产品推荐

