0

我有这个代码:

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
    WebRequest request = WebRequest.Create(url);
    request.Method = "GET";
    WebResponse response = request.GetResponse();
    Stream stream = response.GetResponseStream();
    StreamReader reader = new StreamReader(stream);
    string content = reader.ReadToEnd();
    int start = content.IndexOf("profile/");
    int end = content.IndexOf("'");
    string result = content.Substring(start, end - start - 1);
    reader.Close();
    response.Close();
}

例如,我有一条长线:

<span class="message-profile-name" ><a  href='/profile/daniel'>daniel</a></span>: <span class="message-text">hello everyone<wbr/> <img class='emoticon emoticon-tongue' src='/t.gif'/></span>

我想建立一个新的字符串: daniel 大家好

我该怎么做 ?在我的代码中它不起作用我得到错误异常说

ArgumentOutOfRangeException 长度不能小于零。参数名称:长度

上线:string result = content.Substring(start, end - start - 1); 在这种情况下:start = 19572 end = 2110

4

3 回答 3

1

使用HtmlAgilityPack而不是尝试手动解析。

var wc = new WebClient();

wc.DownloadStringCompleted += (s, e) =>
{
    HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
    doc.LoadHtml(e.Result);

    var link = doc.DocumentNode
                    .SelectSingleNode("//span[@class='message-profile-name']")
                    .Element("a")
                    .Attributes["href"].Value;
};

wc.DownloadStringAsync(new Uri("http://chatroll.com/rotternet"));
于 2012-08-09T21:31:46.317 回答
0

似乎您想要的字符串将始终包含在格式为profile/xxx的 href 中,一旦您将内容转换为文本形式,使用正则表达式会很简单,即使您有可能使用正则表达式仍然有效有多个<a href=...>元素

Match match = Regex.Match(content, @"(?<=<a\s*?href='/profile/\w*?'>\s*?)\w*?(?=\s*?<\s*?/a\s*?>)");
string result = match.Value;

将匹配所有粗体,并且.Value将返回元素的值,在这种情况下daniel,您还可以在正则表达式前面加上(i?)以使其不区分大小写以匹配列表中的最后一项

  • <a href='/profile/daniel'>丹尼尔</a>
  • <a href='/profile/danielbc'>丹尼尔</a>
  • <a href='/profilex/danielbc'>丹尼尔</a>
  • <a href='/profile/danielbc'>丹尼尔</a>
  • <a href='/profile/danielbc '>丹尼尔</a>
  • <a href='/PROFILE/danielbc'>丹尼尔</a>

更新:

要从任何其他类型的元素中获取内容,只需替换突出显示的部分以匹配元素 (?<= <a\s*?href='/profile/\w*?'>\s*? )\w *?(?= \s*?<\s*?/a\s*?> )。在您的情况下,"message-text">hello everyone<wbr/>将是(?i)(?<= "message-text"\s*?>\s*? ) .*? (?= \s*?<\s*?/wbr\s*?> ),这将从以下变体中得到大家好, .*? 表示匹配任何内容(包括空格和标点符号),但尽可能少)。请注意,我从您的回复中更改了您的结束标签,如果它应该是并不是这是一个微小的改变,你可以让它工作

  • "message-text">大家好</wbr>
  • <wbr asdfjlds "message-text">大家好</wbr>
  • <wbr "message-text">大家好</wbr>
于 2012-08-09T22:39:13.100 回答
0

使用适当的工具将符号数组拆分为对您有意义的数据数组。

您可以使用HtmlAgilityPack解析字符串并返回有意义的标记树。

在您可以迭代它们并根据您自己的逻辑聚合成结果字符串之后。

于 2012-08-09T21:30:22.590 回答