Как собрать все ссылки со страницы по стоп словам

Old

Client
Регистрация
24.01.2018
Сообщения
176
Благодарностей
87
Баллы
28
Всем привет, нужна помощь.
Не получается собрать ссылки со страницы по определенным словам. Нашел несколько похожих тем на форуме, но мне они не помогли.

Регуляркой нужно спарсить только те URL, в которых есть слово "link". Из текста нужно взять следующие ссылки:
Код:
http://site.com/one-link.html
http://site.com/two-link-two.html
http://site.com/link-four.html

Текст:
Код:
<a class="page" href="http://site.com/one-link.html" title="one">one</a><a class="page" href="http://site.com/two-link-two.html" title="two">two</a><a class="page" href="http://site.com/three.html" title="three">three</a><a class="page" href="http://site.com/link-four.html" title="four">four</a> lorem ipsum dolor sit amet, consectetur adipiscing elit<a class="page" href="http://site.com/five.html" title="five">five</a>
 

ibred

Client
Регистрация
04.04.2015
Сообщения
3 835
Благодарностей
3 542
Баллы
113
Это можно сделать несколькими способами. Я продемонстрирую 2 из них.

Первый. Помощник парсинга.


Но, к сожалению, он сейчас не работает - обнаружен баг из-за которого не берутся все совпадения.


Второй. Регулярные выражения.

Парсим все ссылки с помощью регулярки:
Код:
(?<=href=")[^"]+
И кладём в список.



А следующим шагом удаляем все значения в списке, которые не содержат link.

 
  • Спасибо
Реакции: evgen_po и Old

Old

Client
Регистрация
24.01.2018
Сообщения
176
Благодарностей
87
Баллы
28
А если все эти ссылки мне нужно найти и заменить на слэш "/" или любой другой символ, тогда мне ни один из способов не подойдет? В общем нужно почистить страницу при помощи подготовленных стоп слов.
Я делал через обработку текста -> замена (regex). Но моя регулярка отрабатывала не так как нужно и брались лишние ссылки.
 
Последнее редактирование:

Old

Client
Регистрация
24.01.2018
Сообщения
176
Благодарностей
87
Баллы
28
Это можно сделать несколькими способами
ibred, подскажи, как эти ссылки можно удалить со страницы или заменить на что-нибудь. Сразу забыл написать, что мне их не только найти нужно.
 

SergSh

Client
Регистрация
10.05.2017
Сообщения
541
Благодарностей
395
Баллы
63
ibred, подскажи, как эти ссылки можно удалить со страницы или заменить на что-нибудь. Сразу забыл написать, что мне их не только найти нужно.
Код:
Tab Tab1 = instance.ActiveTab;

HtmlElementCollection hec = Tab1.FindElementsByXPath("//a");  
foreach(var a in hec)
{
    if(a.GetAttribute("href").Contains("link"))
    {
        a.SetAttribute("href", "/");
        //project.SendInfoToLog(a.OuterHtml);
    }
}
 
  • Спасибо
Реакции: Old

Old

Client
Регистрация
24.01.2018
Сообщения
176
Благодарностей
87
Баллы
28

SergSh

Client
Регистрация
10.05.2017
Сообщения
541
Благодарностей
395
Баллы
63

Old

Client
Регистрация
24.01.2018
Сообщения
176
Благодарностей
87
Баллы
28
Беру исходный код страницы и добавляю в переменную. Теперь нужно взять из переменной, почистить от ссылок, вернуть в переменную и записать в файл. Шаблон работает через Get, без браузера.
 
Последнее редактирование:

SergSh

Client
Регистрация
10.05.2017
Сообщения
541
Благодарностей
395
Баллы
63
HtmlAgilityPack нужно подключить
Код:
string page = project.Variables["page"].Value;
HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
   
        doc.LoadHtml(page);
        var hec = doc.DocumentNode.SelectNodes(@"//a");
       
        if(hec != null)
        {
            foreach(var a in hec)   
            {   
                if(a.GetAttributeValue("href", "").Contains("search"))
                {
                    a.SetAttributeValue("href", "her");
                   // project.SendInfoToLog(a.OuterHtml);
                }   
            }   
             project.Variables["page"].Value = doc.DocumentNode.OuterHtml;
        }
 
  • Спасибо
Реакции: Old

Old

Client
Регистрация
24.01.2018
Сообщения
176
Благодарностей
87
Баллы
28
SergSh, большое спасибо, все работает.

Подскажи еще по этой строке из кода:
Код:
if(a.GetAttributeValue("href", "").Contains("search"))
Вместо "search" я подставил свое слово.
А для чего нужны пустые скобки после href? Какие значения сюда добавлять?

И последний вопрос. Как будет выглядеть поиск сразу по нескольким словам?
Я сделал так (но не уверен, что это правильно):
Код:
string page = project.Variables["page"].Value;
HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
   
        doc.LoadHtml(page);
        var hec = doc.DocumentNode.SelectNodes(@"//a");
       
        if(hec != null)
        {
            foreach(var a in hec) 
            { 
                if(a.GetAttributeValue("href", "").Contains("search"))
                {
                    a.SetAttributeValue("href", "her");
                   // project.SendInfoToLog(a.OuterHtml);
                }

                if(a.GetAttributeValue("href", "").Contains("search-2"))
                {
                    a.SetAttributeValue("href", "her");
                   // project.SendInfoToLog(a.OuterHtml);
                }
            } 
             project.Variables["page"].Value = doc.DocumentNode.OuterHtml;
        }
 

SergSh

Client
Регистрация
10.05.2017
Сообщения
541
Благодарностей
395
Баллы
63
GetAttributeValue вернет (то что в пустых кавычках) если нет значения для атрибута href. такой метод. her замени на что-то другое...
Условия if через else пропускай.
 
  • Спасибо
Реакции: Old

Old

Client
Регистрация
24.01.2018
Сообщения
176
Благодарностей
87
Баллы
28
Код:
string page = project.Variables["page"].Value;
HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();

        doc.LoadHtml(page);
        var hec = doc.DocumentNode.SelectNodes(@"//a");
    
        if(hec != null)
        {
            foreach(var a in hec)
            {
                if(a.GetAttributeValue("href", "").Contains("search"))
                {
                    a.SetAttributeValue("href", "her");
                   // project.SendInfoToLog(a.OuterHtml);
                }
            }
             project.Variables["page"].Value = doc.DocumentNode.OuterHtml;
        }
SergSh, только сейчас заметил, что при добавлении в .Contains("")) слова photo, удаляется так же и photoshop. Можно сделать так, чтобы удалялись ссылки только со словом "photo"?
 

SergSh

Client
Регистрация
10.05.2017
Сообщения
541
Благодарностей
395
Баллы
63
Все что в foreach замени на

Код:
char[] Chars = {'-'}; //сюда добавь разделители слов которые встречаются в ссылках, через запятую в одинарных кавычках      
string[] buf = a.GetAttributeValue("href", "").Split(Chars, System.StringSplitOptions.RemoveEmptyEntries );          
if(buf.Contains("search"))    
{            
    a.SetAttributeValue("href", "her");              
    // project.SendInfoToLog(a.OuterHtml);      
}
 
Последнее редактирование:
  • Спасибо
Реакции: Old

Old

Client
Регистрация
24.01.2018
Сообщения
176
Благодарностей
87
Баллы
28
Заменил, теперь код не срабатывает.
У меня он сейчас выглядит так:
Код:
string page = project.Variables["page"].Value;
HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();

doc.LoadHtml(page);
var hec = doc.DocumentNode.SelectNodes(@"//a");

if(hec != null)
{
    foreach(var a in hec)
    {
        char[] Chars = {',', '.', ':', ';', '!', '?', ' '};
        string[] buf = a.GetAttributeValue("href", "").Split(Chars, System.StringSplitOptions.RemoveEmptyEntries);
        if(buf.Contains("photo"))
    {
        a.SetAttributeValue("href", "");
        // project.SendInfoToLog(a.OuterHtml);
    }

        }
        project.Variables["page"].Value = doc.DocumentNode.OuterHtml;
    }
 

SergSh

Client
Регистрация
10.05.2017
Сообщения
541
Благодарностей
395
Баллы
63
чуть выше код с комментариями по разделителю
 
  • Спасибо
Реакции: Old

Old

Client
Регистрация
24.01.2018
Сообщения
176
Благодарностей
87
Баллы
28
Спасибо, теперь все ок.

SergSh, еще хотел спросить по удалению div.
Я предыдущим кодом удаляю ссылки по стоп словам. В некоторых этих ссылках находятся изображения, которые удаляются вместе с этими ссылками. Теперь хотелось бы удалить из переменной все div-ы с классом links, в которых нет тега img.
Сможешь помочь с этим?
 
Последнее редактирование:

SergSh

Client
Регистрация
10.05.2017
Сообщения
541
Благодарностей
395
Баллы
63
Код:
string page = project.Variables["page"].Value;
HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
         
doc.LoadHtml(page);

var links = doc.DocumentNode.SelectNodes(@"//div[@class = 'links']");       
if(links != null)       
{           
    foreach(var l in links)           
    {   
        if(l.SelectNodes(@".//img").Count == 0)
        {
            l.Remove();   
        }
    }           
    page = doc.DocumentNode.OuterHtml;   
}
 
  • Спасибо
Реакции: Old

Old

Client
Регистрация
24.01.2018
Сообщения
176
Благодарностей
87
Баллы
28
Твой код работает без ошибок. Заменил на свои переменные и у меня перестал работать. Странно.

Ошибка:
Выполнение действия CSharp OwnCode Ссылка на объект не указывает на экземпляр объекта.
 
Последнее редактирование:

Old

Client
Регистрация
24.01.2018
Сообщения
176
Благодарностей
87
Баллы
28
Перепутал, код с твоими переменными отрабатывает с такой же ошибкой:
Выполнение действия CSharp OwnCode Ссылка на объект не указывает на экземпляр объекта.

Можешь глянуть в чем там проблема?
 

SergSh

Client
Регистрация
10.05.2017
Сообщения
541
Благодарностей
395
Баллы
63
Код:
string page = project.Variables["page"].Value;
HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
         
doc.LoadHtml(page);
var links = doc.DocumentNode.SelectNodes(@"//div[@class = 'links']");     
if(links != null)     
{         
    foreach(var l in links)         
    { 
        if(l.SelectSingleNode(@".//img") != null)
        {
            l.Remove(); 
        }
    }         
    page = doc.DocumentNode.OuterHtml; 
}
return page;
 
  • Спасибо
Реакции: Old

Old

Client
Регистрация
24.01.2018
Сообщения
176
Благодарностей
87
Баллы
28
Все отлично, еще раз спасибо.

Только в строке:
Код:
if(l.SelectSingleNode(@".//img") != null)
Изменил "!=" на "==".
Иначе получалось наоборот. Div-ы с картинками удалялись, а без них оставались.
 

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)