如何存储非常大的HTML流的一部分?

时间:2016-10-06 20:44:00

标签: c# html string stream substring

我必须获取网络的 HTML 代码,之后才能找到这个类:

<span class='uccResultAmount'>0,896903</span>

我尝试使用正则表达式。 还有 Streams ,我的意思是,将整个 HTML 代码存储在string中。但是,string的代码非常大。这样就无法实现,因为0,896903中不存在我正在搜索的string金额。

有没有办法只读一小段Stream?

方法的一部分:

public static string getValue()
        {
            string data = "not found";
            string urlAddress = "http://www.xe.com/es/currencyconverter/convert/?Amount=1&From=USD&To=EUR";

            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(urlAddress);
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();

            if (response.StatusCode == HttpStatusCode.OK)
            {
                Stream receiveStream = response.GetResponseStream();
                StreamReader readStream = null;

                if (response.CharacterSet == null)
                {
                    readStream = new StreamReader(receiveStream);
                }
                else
                {
                    readStream = new StreamReader(receiveStream, Encoding.GetEncoding(response.CharacterSet));
                }

                data = readStream.ReadToEnd(); // the string in which I should search for the amount

                response.Close();
                readStream.Close();
            }

如果您找到一种更简单的方法来解决我的问题,请告诉我。

1 个答案:

答案 0 :(得分:0)

我会使用HtmlAgilityPack和Xpath

var web = new HtmlAgilityPack.HtmlWeb();
var doc = web.Load("http://www.xe.com/es/currencyconverter/convert/?Amount=1&From=USD&To=EUR");
var value = doc.DocumentNode.SelectSingleNode("//span[@class='uccResultAmount']")
               .InnerText;

Linq版本也是可能的

var value = doc.DocumentNode.Descendants("span")
            .Where(s => s.Attributes["class"] != null && s.Attributes["class"].Value == "uccResultAmount")
            .First()
            .InnerText;

<强> Don't use this 即可。只是为了展示

  

但问题是这个html代码不适合单个字符串

不正确

string html = new WebClient().DownloadString("http://www.xe.com/es/currencyconverter/convert/?Amount=1&From=USD&To=EUR");
var val = Regex.Match(html, @"<span[^>]+?class='uccResultAmount'>(.+?)</span>")
               .Groups[1]
               .Value;