我有这段代码:
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 hello everyone
我该怎么办? 在我的代码中,它可以解决错误异常
ArgumentOutOfRangeException长度不能小于零。参数 名称:长度
在线:string result = content.Substring(start, end - start - 1);
在这种情况下:start = 19572 end = 2110
答案 0 :(得分: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"));
答案 1 :(得分:0)
答案 2 :(得分:0)
看起来您想要的字符串将始终包含在格式为 profile / xxx 的href中,一旦您将内容转换为文本格式,使用正则表达式就会很简单即使你有可能拥有多个&lt; a href = ...&gt; 元素,仍然可以工作
Match match = Regex.Match(content, @"(?<=<a\s*?href='/profile/\w*?'>\s*?)\w*?(?=\s*?<\s*?/a\s*?>)");
string result = match.Value;
将匹配所有粗体, .Value 将返回元素的值,在这种情况下 daniel ,您也可以使用(i?)强制使用正则表达式使其不区分大小写以匹配列表中的最后一项
<强>更新强>
要从任何其他类型的元素中获取内容,只需替换突出显示的部分以匹配元素,(?&lt; = &lt; a \ s *?href ='/ profile / \ w *?' &GT; \ S * 强>)\ W *(= <强> \ S *&LT;????\ S * /一个\ s *&gt;有强>)。在您的情况下,"message-text">hello everyone<wbr/>
将是(?i)(?&lt; = “message-text”\ s *?&gt; \ s *?)的 * 强> ?(= <强> \ S *&LT;?\ S * / WBR \ S *&gt;有强>)< / em>,这将从以下变体获得 hello everyone ,。*?表示匹配任何内容(包括空格和标点符号),但尽可能少。请注意,我从您的回复中更改了结束标记,如果它应该 而不是 ,那么您可以进行微小的更改以使其正常工作