C# WebClient - 从 URI 获取 HTML 而不是从 OBIEE 获取 CSV

Posted

技术标签:

【中文标题】C# WebClient - 从 URI 获取 HTML 而不是从 OBIEE 获取 CSV【英文标题】:C# WebClient - Getting an HTML from URI instead of CSV from OBIEE 【发布时间】:2020-06-21 15:39:11 【问题描述】:

关注这篇文章:

C# WebClient - Getting an html from URI instead of CSV_

问题在于 csv 是在浏览器中使用 javascript 编译的。在同一篇文章中,推荐使用 Casperjs,但也有使用 c# 的选项,或者如何使用 casperjs 从 OBIEE 获取 csv?

有人有这样的例子吗?

其他信息:

我找到了一个包含以下链接的网页: xls、xml、csv

例如,当我单击每个链接时,将获取 .csv 文件,但如果我尝试使用 WebClient c# 获取带有 javascript 函数的 HTML,我了解到该页面类似于具有以下功能的模板:

一个填充了我需要的数据的数组:

var datos = [];

填充该数组的函数:

function llenaArreglo() 
 var serie = new Array("12/01/1984", "18/01/1984", "DTF", "36,45%");
    datos.push(serie);

...它为每个数据元组重复相同的代码(这很有趣),填充数据数组。

从请求中选择下载类型的函数:

function downloadByType()
    var type = gup("download_type", location.href);
    
    if(type=="csv")
        downloadCsv()
    
    if(type=="xml")
        downloadXml()
    

下载功能,似乎是用所选格式的数据重写当前页面的内容:

function download(data, filename, type) 
    var a = document.createElement("a"),
    //textEncoder = new TextEncoder('utf-16');
    //var contentEncoded = textEncoder.encode([data]);
    file = new Blob([data], type: type);
    if (window.navigator.msSaveOrOpenBlob) // IE10+
        window.navigator.msSaveOrOpenBlob(file, filename);
    else  // Others
        var url = URL.createObjectURL(file);
        a.href = url;
        a.download = filename;
        document.body.appendChild(a);
        a.click();
        setTimeout(function() 
            document.body.removeChild(a);
            window.URL.revokeObjectURL(url);  
        , 0); 
    

以及csv格式的功能:

function downloadCsv()
    var dataCsv = "\ufeff"+"fecha_inicio;fecha_final;tasa_interes;valor_tasa\n";
    for(var i=0; i<datos.length;i++)
        serie = datos[i];
        var fecha_inicio = serie[0];
        var fecha_final = serie[1];
        var tasa_interes = serie[2];
        var valor_tasa = validarNulo(serie[3]);
                                            
        dataCsv += fecha_inicio+";"+fecha_final+
        ";"+tasa_interes+
        ";"+valor_tasa+"\n";
    
    download(dataCsv, "Tasas_captacion_semanales_DTF_CDT_TCC.csv", "data:text/txt;charset=windows-1252;");

如果我使用 WebClient c# 选项,我只使用 javascript 代码获取此 HTML...我尝试使用“CasperJS”但我得到相同的结果,我不知道如何调用“下载”函数或者可能是获取“datos”变量。

我将在 CasperJS 中尝试以下代码:

casper.start('URL').thenEvaluate(
function()
    data= datos;
);

casper.run(function() 
    this.echo('my data:'    + data);
    this.exit();        );

但我觉得我错了,我需要知道如何获得 webpate 的最后结果。

【问题讨论】:

您没有从 WebClient 获取 CSV。您将获得一个 HTML 响应,其中响应的正文包含 csv。所以你已经得到了 HTML。 嗨,我有一个 HTML 代码,但它具有生成输出文件(csv、xml)的 javascript 函数,我找到了一个包含使用这些转换函数的值的数组,我可以抓取它,但我读了可能使用“casperjs”来预处理(我怀疑)URL并直接获取CSV文件的另一篇文章......但我需要一些帮助来了解如何使用“casperjs”来做到这一点:) 如果您进行预处理而不是直接获取数据?您正在处理数据,不会直接获取。预处理和直接作为 OPOSITE。你不能两者都做。 我添加了“附加信息” 【参考方案1】:

我用 CasperJS 解决了我的问题,这不是理想的解决方案,但它是一个解决方案。我抓取了代码以获取变量“datos”(带有数据的数组):

var casper = require('casper').create();
casper.start('uri', function() 
    //this code copied from other post about casperjs
    var myVarInCasper = this.evaluate(function() 
        var myVarInBrowser;
        myVarInBrowser = datos;
        return myVarInBrowser;
    );
    var dataCsv = "\ufeff"+"col001;col002;col003;col003\n";
    //the same code, copied from HTML 
    for(var i=0; i<myVarInCasper.length;i++)
        serie = myVarInCasper[i];
        var col1 = serie[0];
        var col2 = serie[1];
        var col4 = serie[2];
        var col5 = serie[3];
        dataCsv += col1+";"+col2+";"+col3+";"+col4+"\n";
    
    this.echo(dataCsv);
);
casper.run();

使用上面的代码,我在控制台中获取 CSV,我将输出重定向到 Windows 中的文件,并使用命令行创建一个 BATCH 文件。比如:

casperjs.exe sample.js > result.csv

【讨论】:

以上是关于C# WebClient - 从 URI 获取 HTML 而不是从 OBIEE 获取 CSV的主要内容,如果未能解决你的问题,请参考以下文章

webclient c# 中不支持 URI 格式

C# 发送Http请求 - WebClient类

无法从 C# Rest 服务获取 WebClient.UploadFile

使用 C# 以编程方式向 MVC 控制器验证 Azure Ad/OpenId 并获取重定向 uri

由于我的基本 URI 不固定,在 Webflux 中一次又一次地创建 Webclient 是不是明智?

webclient类学习