我有一个 Web 服务,它充当网站群和一些分析软件之间的接口。部分分析跟踪需要获取页面标题。我不想将它从网页传递给网络服务,而是HTTPWebRequest
用来调用页面。
我有代码可以获取整个页面并解析 html 以获取标题标签,但我不想下载整个页面来获取头部信息。
我开始了
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("url");
request.Method = "HEAD";
我有一个 Web 服务,它充当网站群和一些分析软件之间的接口。部分分析跟踪需要获取页面标题。我不想将它从网页传递给网络服务,而是HTTPWebRequest
用来调用页面。
我有代码可以获取整个页面并解析 html 以获取标题标签,但我不想下载整个页面来获取头部信息。
我开始了
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("url");
request.Method = "HEAD";
好主意,但HEAD请求仅返回文档的 HTTP 标头。这不包括标题元素,它是 HTTP 消息正文的一部分。
尝试这个:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.IO;
using System.Text.RegularExpressions;
namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
string page = @"http://stackoverflow.com/";
HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(page);
StreamReader SR = new StreamReader(req.GetResponse().GetResponseStream());
Char[] buf = new Char[256];
int count = SR.Read(buf, 0, 256);
while (count > 0)
{
String outputData = new String(buf, 0, count);
Match match = Regex.Match(outputData, @"<title>([^<]+)", RegexOptions.IgnoreCase);
if (match.Success)
{
Console.WriteLine(match.Groups[1].Value);
}
count = SR.Read(buf, 0, 256);
}
}
}
}
如果您不想请求整个页面,可以分段请求。http 规范定义了一个名为 Range 的 http 标头。你可以像下面这样使用它:
范围:字节=0-100
您可以查看返回的内容并找到标题。如果它不存在,那么请求 Range: 101-200 等等,直到你得到你需要的。
显然,Web 服务器需要支持范围,所以这可能会被击中或错过。
所以我不得不去像......
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(URL);
HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
Stream st = resp.GetResponseStream();
StreamReader sr = new StreamReader(st);
string buffer = sr.ReadToEnd();
int startPos, endPos;
startPos = buffer.IndexOf("<title>",
StringComparison.CurrentCultureIgnoreCase) + 7;
endPos = buffer.IndexOf("</title>",
StringComparison.CurrentCultureIgnoreCase);
string title = buffer.Substring(startPos, endPos - startPos);
Console.WriteLine("Response code from {0}: {1}", s,
resp.StatusCode);
Console.WriteLine("Page title: {0}", title);
sr.Close();
st.Close();