Во-первых, вы можете создать функцию, которая будет возвращать весь HTML-код сайта, как вы это сделали. Вот тот, который у меня есть!
public string GetPageContents()
{
string link = "https://www.abc.net.au/news/science/"
string pageContent = "";
WebClient web = new WebClient();
Stream stream;
stream = web.OpenRead(link);
using (StreamReader reader = new StreamReader(stream))
{
pageContent = reader.ReadToEnd();
}
stream.Close();
return pageContents;
}
Тогда вы можете создать функцию, которая будет возвращать подстроку или список подстрок (это означает, что если вы захотите все теги < a>, вы, вероятно, получите больше, чем один).
List<string> divTags = GetBetweenTags(pageContents, "<div>", "</div>")
Это даст вам список, где вы можете, например, сделать еще один поиск для < a> теги внутри каждого из них < теги div>.
public List<string> GetBetweenTags(string pageContents, string startTag, string endTag)
{
Regex rx = new Regex(startTag + "(.*?)" + endTag);
MatchCollection col = rx.Matches(value);
List<string> tags = new List<string>();
foreach(Match s in col)
tags.Add(s.ToString());
return tags;
}
Редактировать: Ух ты, не знал о HTML Agility Pack, спасибо @Gauravsa, я обновлю свой проект, чтобы использовать его!
Достигать байты отправило, можно использовать HttpResponse.Filter
свойство. Поскольку в документах MSDN говорится, что это свойство получает или устанавливает переносящийся объект фильтра, который используется для изменения тела объекта HTTP перед передачей.
Можно создать новое System.IO.Stream
это переносит существующее HttpResponse.Filter
поток и количества байты передали в Write
метод перед передачей их. Например:
public class ContentLengthModule : IHttpModule
{
public void Init(HttpApplication context)
{
context.BeginRequest += OnBeginRequest;
context.EndRequest += OnEndRequest;
}
void OnBeginRequest(object sender, EventArgs e)
{
var application = (HttpApplication) sender;
application.Response.Filter = new ContentLengthFilter(application.Response.Filter);
}
void OnEndRequest(object sender, EventArgs e)
{
var application = (HttpApplication) sender;
var contentLengthFilter = (ContentLengthFilter) application.Response.Filter;
var contentLength = contentLengthFilter.BytesWritten;
}
public void Dispose()
{
}
}
public class ContentLengthFilter : Stream
{
private readonly Stream _responseFilter;
public int BytesWritten { get; set; }
public ContentLengthFilter(Stream responseFilter)
{
_responseFilter = responseFilter;
}
public override void Flush()
{
_responseFilter.Flush();
}
public override long Seek(long offset, SeekOrigin origin)
{
return _responseFilter.Seek(offset, origin);
}
public override void SetLength(long value)
{
_responseFilter.SetLength(value);
}
public override int Read(byte[] buffer, int offset, int count)
{
return _responseFilter.Read(buffer, offset, count);
}
public override void Write(byte[] buffer, int offset, int count)
{
BytesWritten += count;
_responseFilter.Write(buffer, offset, count);
}
public override bool CanRead
{
get { return _responseFilter.CanRead; }
}
public override bool CanSeek
{
get { return _responseFilter.CanSeek; }
}
public override bool CanWrite
{
get { return _responseFilter.CanWrite; }
}
public override long Length
{
get { return _responseFilter.Length; }
}
public override long Position
{
get { return _responseFilter.Position; }
set { _responseFilter.Position = value; }
}
}