Получение текста между всеми тегами в данном html и рекурсивным просмотром ссылок

c# html html-agility-pack web-crawler

Вопрос

Я проверил пару сообщений о переполнении стека относительно получения всех слов между всеми тегами html! Все они меня смутили! некоторые люди рекомендуют регулярное выражение специально для одного тега, в то время как некоторые упомянули методы разбора! Я в основном пытаюсь сделать веб-гусеничный движок! для этого у меня есть html ссылки, которую я выбрал для своей программы в строке! Я также извлек ссылки из html, которые я сохранил в своей строке данных! теперь я хочу просканировать глубину и извлечь слова на странице всех ссылок, которые я извлек из своей строки! У меня есть два вопроса! как я могу получить слова на каждой из веб-страниц, игнорируя теги и java-скрипт? во-вторых, как бы я рекурсивно просканировал через ссылки?

Вот как я получаю html в строке:

public void getting_html_code_of_link()
    {
        string urlAddress = "http://google.com";

        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(urlAddress);
        HttpWebResponse response = (HttpWebResponse)request.GetResponse();
        if (response.StatusCode == HttpStatusCode.OK)
        {
            Stream receiveStream = response.GetResponseStream();
            StreamReader readStream = null;
            if (response.CharacterSet == null)
                readStream = new StreamReader(receiveStream);
            else
                readStream = new StreamReader(receiveStream, Encoding.GetEncoding(response.CharacterSet));
            data = readStream.ReadToEnd();
            response.Close();
            readStream.Close();
            Console.WriteLine(data);
        }
    }

и вот как извлекает ссылки refrences из url я даю:

public void regex_ka_kaam()
    {
        StringBuilder sb = new StringBuilder();
        //Regex hrefs = new Regex("<a href.*?>");
        Regex http = new Regex("http://.*?>");

        foreach (Match m in http.Matches(data))
        {
            sb.Append(m.ToString());
            if (http.IsMatch(m.ToString()))
            {

                sb.Append(http.Match(m.ToString()));
                sb.Append("                                                                        ");
                //sb.Append("<br>");
            }
            else
            {
                sb.Append(m.ToString().Substring(1, m.ToString().Length - 1)); //+ "<br>");
            }
        }
        Console.WriteLine(sb);
    }

Популярные ответы

Regex не является хорошим выбором для разбора HTML-файлов.

HTML не является строгим и не является регулярным с его форматом ..

Использовать htmlagilitypack


Это извлекает все ссылки с веб-страницы

public List<string> getAllLinks(string webAddress)
{
    HtmlAgilityPack.HtmlWeb web = new HtmlAgilityPack.HtmlWeb();
    HtmlDocument newdoc=web.Load(webAddress);

    return doc.DocumentNode.SelectNodes("//a[@href]")
              .Where(y=>y.Attributes["href"].Value.StartsWith("http"))
              .Select(x=>x.Attributes["href"].Value)
              .ToList<string>();
}

это получает весь контент, исключая теги в html

public string getContent(string webAddress)
{
    HtmlAgilityPack.HtmlWeb web = new HtmlAgilityPack.HtmlWeb();
    HtmlDocument doc=web.Load(webAddress);

    return string.Join(" ",doc.DocumentNode.Descendants().Select(x=>x.InnerText));
}

это проскальзывает через все ссылки

public void crawl(string seedSite)
{
        getContent(seedSite);//gets all the content
        getAllLinks(seedSite);//get's all the links
}


Related

Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow