【问题标题】:Read a String like a StreamReader像 StreamReader 一样读取字符串
【发布时间】:2012-07-10 22:24:48
【问题描述】:

首先:对不起我的英语不好!

我知道标题不是最好的英文,但我真的不知道如何格式化这个问题...
我要做的是逐行读取 HTML 源代码,因此当它看到给定的单词(如 http://)时,它会复制整个句子,这样我就可以剥离其余部分,只保留 URL。

这是我尝试过的:

using (var source = new StreamReader(TempFile))
{
    string line;
    while ((line = source.ReadLine()) != null)
    {
        if (line.Contains("http://"))
        {
            Console.WriteLine(line);
        }
    }
}

如果我想从外部文件中读取它,这非常有效,但是当我想读取字符串或字符串生成器时它不起作用,你如何逐行读取这些?

【问题讨论】:

    标签: c# streamreader


    【解决方案1】:

    您可以使用new StringReader(theString)string 来做到这一点,但我质疑您的整体策略。使用 HTML Agility Pack 之类的工具会更好。

    例如,这里是提取所有超链接的 HTML Agility Pack:

    HtmlDocument doc = new HtmlDocument();
    doc.LoadHtml(theString);
    foreach(HtmlNode link in doc.DocumentElement.SelectNodes("//a[@href]")
    {
       HtmlAttribute att = link["href"];
       Console.WriteLine(att.Value);
    }
    

    【讨论】:

    • 我同意。还要确保将 ScrapySharp 与 HtmlAgilityPack 一起使用。它让您可以使用熟悉的 jQuery 语法来选择元素。从字面上看,您的工作效率会翻倍。 romcyber.com/post/2012/01/27/ScrapySharp-in-english-%29.aspx
    • 但这是另一个依赖...并不是说它一定很糟糕,只是需要考虑的事情。
    • @vines:一个小问题。图书馆很小。
    • @vines 相比解析html正确,是小事一桩
    • @MarcGravell 我认为这段代码行不通,主要是因为链接在 javascript 中的某处:(。
    【解决方案2】:

    一个字符串只是一个字符串,它没有任何行。

    您可以使用String.Split 之类的东西来分隔\r 符号。

    MSDN:String.Split()

    string words = "This is a list of words, with: a bit of punctuation" +
                           "\rand a newline character.";
    
    string [] split = words.Split(new Char [] {'\r' });
    
    foreach (string s in split) {
        if (s.Trim() != "")       
            Console.WriteLine(s);
    }
    

    【讨论】:

      【解决方案3】:

      首先,您可以使用StringReader

      另一种选择是通过首先将字符串转换为字节数组从字符串创建MemoryStream,如https://stackoverflow.com/a/10380166/396583中所述

      【讨论】:

        【解决方案4】:

        我认为您可以对输入进行标记并检查每个条目的所需内容。

         string[] info = myStringBuilder.toString().split[' '];
         foreach(var item in info) {
         if(item.Contains('http://') {
            //work with it
            }
         }
        

        【讨论】:

          【解决方案5】:

          您可以使用内存流进行读取。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-08-07
            • 2018-05-31
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多