Я пытаюсь создать страницу ASP.NET, которая может сканировать веб-страницы и корректно отображать их со всеми соответствующими HTML-элементами, отредактированными для включения абсолютных URL-адресов, где это необходимо.
На этот вопрос частично ответ здесь1003 *https://stackoverflow.com/a/2719712/696638
Используя комбинацию ответа выше и этого сообщения в блоге http://blog.abodit.com/2010/03/a-simple-web-crawler-in-c-using-htmlagilitypack/ Я построил следующее:
public partial class Crawler : System.Web.UI.Page {
protected void Page_Load(object sender, EventArgs e) {
Response.Clear();
string url = Request.QueryString["path"];
WebClient client = new WebClient();
byte[] requestHTML = client.DownloadData(url);
string sourceHTML = new UTF8Encoding().GetString(requestHTML);
HtmlDocument htmlDoc = new HtmlDocument();
htmlDoc.LoadHtml(sourceHTML);
foreach (HtmlNode link in htmlDoc.DocumentNode.SelectNodes("//a[@href]")) {
if (!string.IsNullOrEmpty(link.Attributes["href"].Value)) {
HtmlAttribute att = link.Attributes["href"];
string href = att.Value;
// ignore javascript on buttons using a tags
if (href.StartsWith("javascript", StringComparison.InvariantCultureIgnoreCase)) continue;
Uri urlNext = new Uri(href, UriKind.RelativeOrAbsolute);
if (!urlNext.IsAbsoluteUri) {
urlNext = new Uri(new Uri(url), urlNext);
att.Value = urlNext.ToString();
}
}
}
Response.Write(htmlDoc.DocumentNode.OuterHtml);
}
}
Это заменяет только атрибут href для ссылок.Расширяя это, я хотел бы знать, какой наиболее эффективный способ будет включать атрибут
href
для <a>
элементов href
атрибут для * 1019атрибут * elements src
для <script>
атрибут src
атрибут для <img>
elements action
атрибут для <form>
elements
И о чем еще могут подумать другие люди?
Можно ли их найти, используя один вызов SelectNodes
с монстром xpath, или было бы более эффективно вызывать SelectNodes несколько раз и проходить черезкаждая коллекция?