Есть ли функция пропуска повторяющихся значений, записываемых в текстовый файл? - PullRequest
0 голосов
/ 14 июля 2020

Я пытаюсь получить все гиперссылки из массива, соответствующие слову «контакты», в текстовый файл .csv. Проблема в том, что если он найдет другую контактную гиперссылку на том же веб-сайте, он снова распечатает ее. Как это исправить? Также, как очистить несколько веб-сайтов для определенного c div, содержащего ключевые слова: («Номер телефона», «Адрес», «Электронная почта» и т. Д. c.)?

private void contactbutton_Click(object sender, EventArgs e)
    {
        ArrayList domainlist = new ArrayList();  
        const Int32 BufferSize = 128;
        // -- Location of domain list file --
        using (var fileStream = File.OpenRead("C:/Users/Username/Desktop/domains.txt"))           
        using (var streamReader = new StreamReader(fileStream, Encoding.UTF8, true, BufferSize))
        {
            String line;
            while ((line = streamReader.ReadLine()) != null)
                domainlist.Add(line);
        }
        foreach (string s in domainlist)
        {
            SearchHyperlinks("https://" + s);
        }
    }



public static void SearchHyperlinks(string address4)
    {

        HtmlWeb hw = new HtmlWeb();
        HtmlAgilityPack.HtmlDocument doc = hw.Load(address4);

        
        String GetAbsoluteUrlString(string baseUrl, string url)
        {
            var uri = new Uri(url, UriKind.RelativeOrAbsolute);
            if (!uri.IsAbsoluteUri)
                uri = new Uri(new Uri(baseUrl), uri);
            return uri.ToString();
        }      
        try
        {
            using (var w = new StreamWriter("C:/Users/Username/Desktop/hyperlink.csv"))
                foreach (HtmlNode link in doc.DocumentNode.SelectNodes("//a[starts-with(., 'Contacts') or starts-with(., 'contacts') or starts-with(., 'CONTACTS') or starts-with (., 'Shop Contacts')]"))
                {
                    String hrefValue = link.Attributes["href"].Value;

                    if (hrefValue != null)
                    {
                        String fullhref = GetAbsoluteUrlString(address4, hrefValue);
                        Console.WriteLine(fullhref);
                        using (var textWriter = new StreamWriter("C:/Users/Username/Desktop/hyperlinks.csv", true))
                        {
                            var writer = new CsvWriter(textWriter, CultureInfo.InvariantCulture);
                            writer.Configuration.Delimiter = ",";
                            writer.WriteField(fullhref);
                            writer.NextRecord();
                        }
                    }

                }
        }

        catch (System.NullReferenceException)
        {
            Console.WriteLine("Hyperlinks not found");
        }

1 Ответ

2 голосов
/ 14 июля 2020

Перепишите свой метод на самом деле Поиск , а не Запишите :

public static IEnumerable<string> SearchHyperlinks(string address4)
{
    var hw = new HtmlWeb();
    var doc = hw.Load(address4);

    String GetAbsoluteUrlString(string baseUrl, string url)
    {
        var uri = new Uri(url, UriKind.RelativeOrAbsolute);
        if (!uri.IsAbsoluteUri)
            uri = new Uri(new Uri(baseUrl), uri);
        return uri.ToString();
    }
    var links = doc.DocumentNode.SelectNodes("//a[starts-with(., 'Contacts') or starts-with(., 'contacts') or starts-with(., 'CONTACTS') or starts-with (., 'Shop Contacts')]");
    if(links == null)
       yield return break;
    foreach (var link in links)
    {
        var hrefValue = link.Attributes["href"].Value;
        if (hrefValue != null)
        {
            var fullhref = GetAbsoluteUrlString(address4, hrefValue);
            yield return fullhref;
        }
    }
}

Затем вы получите отдельные значения:

var distinct = SearchHyperlinks(input).Distinct();

Затем вы пишете их все, где хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...