Flask应用中newspaper爬取结果与直接运行Python不一致求助
问题分析与解决方案
这是个典型的URL参数传递时的编码问题,我来帮你拆解原因和解决办法:
核心原因
你本地测试用的URL是转义后的格式:https://www.dev-insider.de/index.cfm?pid=15010&pk=676039(这里&是HTML转义后的&),但当你在浏览器或其他客户端请求Flask接口时,如果直接传递原始URL:
http://localhost:5000/test?url=https://www.dev-insider.de/index.cfm?pid=15010&pk=676039
浏览器会把第二个&当成Flask接口的参数分隔符,导致request.args.get('url')只能拿到https://www.dev-insider.de/index.cfm?pid=15010,丢失了后面的pk=676039参数。爬取这个不完整的URL时,目标网站会返回默认的导航页内容,也就是你看到的那段文字。
解决方法
方法1:请求时对URL进行编码
在传递url参数前,把URL中的&替换成URL编码后的%26,比如请求地址改成:
http://localhost:5000/test?url=https://www.dev-insider.de/index.cfm?pid=15010%26pk=676039
这样Flask就能拿到完整的URL了。
方法2:在Flask中手动拼接完整参数
如果无法控制请求端的编码行为,可以在Flask里手动拼接所有后续参数:
@app.route('/test') def bla(): # 获取基础url部分 base_url = request.args.get('url') # 获取剩余的所有参数 remaining_params = request.args.to_dict() del remaining_params['url'] # 拼接完整URL if remaining_params: params_str = '&'.join([f"{k}={v}" for k, v in remaining_params.items()]) full_url = f"{base_url}&{params_str}" else: full_url = base_url article = Article(str(full_url), browser_user_agent='Chrome', http_success_only=False) article.download() article.parse() text_raw = article.text return text_raw
这样即使请求时的&被拆分,也能把参数重新拼回去。
方法3:使用POST请求传递URL
如果是前端调用,改用POST请求,把URL放在请求体里(比如JSON格式),这样就不会有URL参数拆分的问题:
@app.route('/test', methods=['POST']) def bla(): data = request.get_json() url = data.get('url') article = Article(str(url), browser_user_agent='Chrome', http_success_only=False) article.download() article.parse() text_raw = article.text return text_raw
请求时用POST发送JSON:
{"url": "https://www.dev-insider.de/index.cfm?pid=15010&pk=676039"}
验证建议
你可以先在Flask的bla函数里加一行打印,看看实际拿到的url是什么:
print("Received URL:", url)
这样就能快速确认是不是URL被截断了。
内容的提问来源于stack exchange,提问作者hag o hi
相关产品推荐
相关产品推荐

