.net HTMLAgilityPack -仅获取头部信息,而不获取主体

fzsnzjdm  于 2022-12-20  发布在  .NET
关注(0)|答案(1)|浏览(132)

我需要从网站上获取一些元标记。HTMLAgilityPack是很好的。我唯一的问题是,它得到了整个网站,并通过它过滤。我想知道是否有一种方法,只有刮头部部分没有身体,因为我真的不需要它在这种情况下。
这是我的想法

url = "some website"
var getHtmlDoc = new HtmlWeb();
var document = getHtmlDoc.Load(url); //document gets the entire website
var metaTags = document.DocumentNode.SelectNodes("//meta");

我尝试做的是找到一种方法,让getHtmlDoc.Load(url)在获取数据时离开主体。
先谢了。

waxmsbnn

waxmsbnn1#

我不认为您所要求的是HtmlWeb所能实现的,但是对于一个合适的HTTP客户端(如this),您可以在请求中使用Range报头。

const string url = "https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Range";

var client = new HttpClient();

var request = new HttpRequestMessage(HttpMethod.Get, url);
request.Headers.Range = new RangeHeaderValue(0, 5000);

HttpResponseMessage response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();

string html = await response.Content.ReadAsStringAsync();

响应可能不包含完整的<head>元素。由于选择正确的范围只是猜测,您可能需要选择一个足够高的值并实现一个后备。

const string url = "https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Range";
var rangeEnd = 5000;

// the request part
var client = new HttpClient();

var request = new HttpRequestMessage(HttpMethod.Get, url);
request.Headers.Range = new RangeHeaderValue(0, rangeEnd);

HttpResponseMessage response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();

string html = await response.Content.ReadAsStringAsync();

// the fallback
while (html.IndexOf("</head>", StringComparison.OrdinalIgnoreCase) <= 0)
{
    rangeEnd += 5000;
    request.Headers.Range = new RangeHeaderValue(0, rangeEnd);

    response = await client.SendAsync(request);
    response.EnsureSuccessStatusCode();

    html = await response.Content.ReadAsStringAsync();
}

// the parsing
int indexOfClosingTag = html.IndexOf("</head>", StringComparison.OrdinalIgnoreCase);

html = html.Substring(0, indexOfClosingTag + "</head>".Length);

var doc = new HtmlDocument();
doc.LoadHtml(html);

相关问题