使用Julia的try-catch处理爬虫不可用URL时出现0x0 DataFrame的求助
Julia爬虫try-catch导致空DataFrame的修复方案
问题根源
你的代码出现空DataFrame有三个核心问题:
HTTP.get(url)放在try块外,请求失败(如404、网络错误)会直接抛出异常中断循环,无法进入catch分支- try块内错误地向未初始化的
df对象push数据,而非预先定义的information数组 - try块覆盖范围太小,仅包含数据提取环节,未覆盖请求和HTML解析步骤,无法处理这些环节的异常
修正后的代码
下面是能正确忽略不可用URL的完整代码:
using HTTP using Gumbo using Cascadia using DataFrames using CSV links = ["0100111338", "0100105077", "0100110528", "0107464283", "0105342089"] base_url = "https://infodoanhnghiep.com/tim-kiem/ma-so-thue/" urls = [base_url * link * "/" for link in links] information = [] for url in urls try # 将请求、解析、提取全放入try块 r = HTTP.get(url) h = parsehtml(String(r.body)) companies = eachmatch(sel".company-item", h.root) name = string(companies[1][2][1][1]) tax = string(companies[1][4][1]) address = string(companies[1][5][1]) push!(information, (name = name, tax = tax, address = address)) catch e # 打印异常信息方便调试(可选) println("处理URL失败: $url,错误信息: $e") # 直接跳过无效URL,不添加空行 continue end end df = DataFrame(information) CSV.write("information.csv", df, writeheader=true, utf8=true)
关键修改说明
- 扩大try块范围:把
HTTP.get、HTML解析、数据提取全部放入try块,确保任何环节出错都能被捕获 - 修正push目标:将数据push到
information数组,而非未定义的df - 异常处理逻辑:捕获异常后打印错误信息(可选),然后用
continue跳过当前无效URL,不向数组添加空记录 - 简化URL生成:用列表推导式替代循环push,更符合Julia风格
内容的提问来源于stack exchange,提问作者Tann
相关产品推荐
相关产品推荐

