Зеркало веб-страницы ASP.NET, замена всех относительных URL-адресов на абсолютные пути - PullRequest
1 голос
/ 05 января 2012

Я пытаюсь создать страницу 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 несколько раз и проходить черезкаждая коллекция?

1 Ответ

3 голосов
/ 05 января 2012

Должно работать следующее:

SelectNodes("//*[@href or @src or @action]")

, и тогда вам придется адаптировать приведенный ниже оператор if.

...