[РЕШЕНО] Как спарсить все значения частичного известного аттрибута через Xpath?

Gunjubasik

Client
Регистрация
30.05.2019
Сообщения
3 523
Благодарностей
1 321
Баллы
113
Доброго времени. Есть допустим html:
HTML:
<div id123="jumpToTop1"></div>
<div id413="jumpToTop2"></div>
<div id4123="jumpToTop3"></div>
<div id4214="jumpToTop4"></div>
Нужно найти все значения с помощью XPath частично известного аттрибута id:
//div[attribute::*[contains(local-name(), 'id')]]
Т.е. сам xpath найден, но вот как прописать, что бы мне выдало значение аттрибута - не понятно.
Например через кубик парсинга, частиное совпадение аттрибута вписать нельзя
102354
И через C# не понятно как прописать Xpath, зная только частичный аттрибут.
 

Gunjubasik

Client
Регистрация
30.05.2019
Сообщения
3 523
Благодарностей
1 321
Баллы
113

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 720
Баллы
113
  • Спасибо
Реакции: Gunjubasik

Gunjubasik

Client
Регистрация
30.05.2019
Сообщения
3 523
Благодарностей
1 321
Баллы
113
ну сам элемент по xpath находить, парсить с него весь html и его распарсить регуляркой.
Спасибо конечно, но хотел узнать есть ли метод xpath - без доп. регулярок. Понятное дело что регуляркой все можно достать.
 

artsmm

Client
Регистрация
03.10.2018
Сообщения
1 136
Благодарностей
196
Баллы
63
Приветствую. Если верно понял вопрос, то:
Попробуйте регуляркой:
C#:
string pattern = "id(\\d+)";

MatchCollection matches = Regex.Matches(input, pattern);

foreach (Match match in matches)
{
    Console.WriteLine(match.Groups[1].Value);
}
и по xpath:
C#:
XmlDocument doc = new XmlDocument();
doc.LoadXml(input);

XmlNodeList nodes = doc.SelectNodes("//*[@id]");

foreach (XmlNode node in nodes)
{
    Console.WriteLine(node.Attributes["id"].Value);
}
Не проверял, написал навскидку, попробуйте, напишите получилось или нет
 

Gunjubasik

Client
Регистрация
30.05.2019
Сообщения
3 523
Благодарностей
1 321
Баллы
113
Приветствую. Если верно понял вопрос, то:
Попробуйте регуляркой:
C#:
string pattern = "id(\\d+)";

MatchCollection matches = Regex.Matches(input, pattern);

foreach (Match match in matches)
{
    Console.WriteLine(match.Groups[1].Value);
}
и по xpath:
C#:
XmlDocument doc = new XmlDocument();
doc.LoadXml(input);

XmlNodeList nodes = doc.SelectNodes("//*[@id]");

foreach (XmlNode node in nodes)
{
    Console.WriteLine(node.Attributes["id"].Value);
}
Не проверял, написал навскидку, попробуйте, напишите получилось или нет
Первый вариант регуляркой - тогда уже проще взять кубик Regex и выпарсить все что нужно, но речь идет конкретно о методах Хпаз и не более. Решить палками я могу без проблем, я пытаюсь освоить тонкости xpath, если они есть - без сторонних шаманских палок.

Второй вариант вы проверяли? Так как если в код страницы вставить html который я описал выше - оно работать не будет, по крайней мере я даже примерно не вижу логику как оно вдруг должно заработать, если в примере указан конкретный id - без частичного совпадения.
 

orka13

Client
Регистрация
07.05.2015
Сообщения
2 177
Благодарностей
2 184
Баллы
113
Дернуло меня что где-то сталкивался с подобным, увы, тогда мозгов не хватило найти решение, сейчас исправлюсь. Решение на HtmlAgilityPack библиотеке:
C#:
// добавьте в шаблон список Spisok , ниже чистим его:
project.Lists["Spisok"].Clear();
HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument(); // создание объекта
var template_html = project.Variables["Html_Code"].Value; // грузим наш код 
doc.LoadHtml(template_html);
// перебираем каждый элемент найденный по хпас с переменной var_xpath1:
foreach(HtmlNode node in doc.DocumentNode.SelectNodes(project.Variables["var_xpath1"].Value))
{
    // перебираем каждый атрибут этого элемента:
    foreach(HtmlAttribute Attribute_i in node.GetAttributes()) {
        // вытягиваем имя атрибута:
        string Attribute_i_Name = Attribute_i.Name;        
        if (Attribute_i_Name.Contains("id")) {
            // вытягиваем значение атрибута, если выше подошло имя:
            string Attribute_i_value = Attribute_i.Value;
            Attribute_i_value = System.Net.WebUtility.HtmlDecode(Attribute_i_value);
            //добавляем значение в наш список:
            project.Lists["Spisok"].Add(Attribute_i_value);
            // и в лог выводим все:
            project.SendInfoToLog(Attribute_i_Name + " > " + Attribute_i_value, false); 
        }
    }    
}
Результат:
102357
 
Последнее редактирование:
  • Спасибо
Реакции: Gunjubasik и Phoenix78

artsmm

Client
Регистрация
03.10.2018
Сообщения
1 136
Благодарностей
196
Баллы
63

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