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

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>
 
Это можно сделать несколькими способами. Я продемонстрирую 2 из них.

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


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


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

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

Iqzxked.png


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

ac3k97P.png
 
  • Спасибо
Реакции: evgen_po и Old
А если все эти ссылки мне нужно найти и заменить на слэш "/" или любой другой символ, тогда мне ни один из способов не подойдет? В общем нужно почистить страницу при помощи подготовленных стоп слов.
Я делал через обработку текста -> замена (regex). Но моя регулярка отрабатывала не так как нужно и брались лишние ссылки.
 
Последнее редактирование:
Это можно сделать несколькими способами
ibred, подскажи, как эти ссылки можно удалить со страницы или заменить на что-нибудь. Сразу забыл написать, что мне их не только найти нужно.
 
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
Беру исходный код страницы и добавляю в переменную. Теперь нужно взять из переменной, почистить от ссылок, вернуть в переменную и записать в файл. Шаблон работает через Get, без браузера.
 
Последнее редактирование:
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
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;
        }
 
GetAttributeValue вернет (то что в пустых кавычках) если нет значения для атрибута href. такой метод. her замени на что-то другое...
Условия if через else пропускай.
 
  • Спасибо
Реакции: Old
Код:
Развернуть Свернуть Копировать
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"?
 
Все что в 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
Заменил, теперь код не срабатывает.
У меня он сейчас выглядит так:
Код:
Развернуть Свернуть Копировать
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, еще хотел спросить по удалению div.
Я предыдущим кодом удаляю ссылки по стоп словам. В некоторых этих ссылках находятся изображения, которые удаляются вместе с этими ссылками. Теперь хотелось бы удалить из переменной все div-ы с классом links, в которых нет тега img.
Сможешь помочь с этим?
 
Последнее редактирование:
Код:
Развернуть Свернуть Копировать
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
Твой код работает без ошибок. Заменил на свои переменные и у меня перестал работать. Странно.

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

Можешь глянуть в чем там проблема?
 
Код:
Развернуть Свернуть Копировать
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
Все отлично, еще раз спасибо.

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

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