簡體   English   中英

C# 在 Visual Studio 調試器中運行項目或運行構建的可執行文件時,HtmlAgilityPack 的行為不同

[英]C# HtmlAgilityPack behaves differently when running project in Visual Studio debugger or when running a built executable

我正在嘗試使用 C# 的 HtmlAgilityPack 庫廢棄一個 web 站點。更具體地說,我正在從一個包含加密交換、匯率和其他數據的表中提取數據。 問題是:當我在 Visual Studio 中啟動項目時,所有數據總是被正確提取並且沒有錯誤,但是,當我構建項目並將其作為可執行文件運行時,表列之一是 50%時間為空(我想 Xpath 只返回一個空節點)。

更重要的是,我在我的另一個使用 HtmlAgilityPack 的項目中發現了這種行為。 它類似於 web 抓取,但是我首先需要登錄另一個 web 站點。每個小時我都需要重新登錄以從該站點獲取新鮮的 cookies,但是每隔 10-12 小時項目就會失敗,因為它找不到登錄頁面中指定的 html 元素。 我在 visual studio 中啟動它 1 次,它工作正常,我重新啟動可執行文件,它繼續正常行為另外 10-12 小時,直到它再次絆倒。

下面是第一種情況的代碼片段:

//Getting the web page
HtmlWeb web = new HtmlWeb();
htmlDoc = web.Load("https://www.bestchange.ru/bitcoin-to-bitcoin-bep20.html", proxies[p].ip, proxies[p].port, proxies[p].login, proxies[p].password);

// parse NAME
if (htmlDoc.DocumentNode != null)
{
    xpath = $"//body/div[3]/div[2]/div/div/div[1]/div[2]/div[6]/div[2]/table/tbody/tr{i}/td[2]/div/div/div";
    HtmlAgilityPack.HtmlNode bodyNode = htmlDoc.DocumentNode.SelectSingleNode(xpath);
    if (bodyNode != null)
    {
        exchange = bodyNode.InnerHtml.ToString();
        Console.WriteLine("Name: " + exchange);
    }
}
//parse PRICE
//This is what gets screwed
if (htmlDoc.DocumentNode != null)
{
    xpath = $"//body/div[3]/div[2]/div/div/div[1]/div[2]/div[6]/div[2]/table/tbody/tr{i}/td[3]/div[1]/text()";
    HtmlAgilityPack.HtmlNode bodyNode = htmlDoc.DocumentNode.SelectSingleNode(xpath);
    if (bodyNode != null)
    {
        Double.TryParse(bodyNode.InnerHtml, out price);
        Console.WriteLine("Price: " + price);
    }
}

所以價格通常是拉錯的(如0)。

我嘗試在不同的操作系統 - mac 和 windows 上運行它,在另一個平台上再次編碼,但結果總是一樣的。

我終於弄清楚了問題所在,它與 HtmlAilityPack 無關,而是文化問題。 不知何故,我的 Double.TryParse 方法只考慮使用“,”而不是“。”的雙打。 (並且正在輸出相同的內容)。 我通過將默認線程文化設置為“en-Us”來解決它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM