Забористый xPath

soprano

Client
Регистрация
25.08.2011
Сообщения
862
Благодарностей
930
Баллы
93
Есть такой код
HTML:
<div style='overflow-x:auto;'><b>Your code:</b> d3b7d90c3bfc93c82c702110304aaa92a2cc10df552aeb866473d1c7a0072c25 <br/><br/></div> <div style='overflow-x:auto;'>
нужно спарсить значение Your code: d3b7d90c3bfc93c82c702110304aaa92a2cc10df552aeb866473d1c7a0072c25
и сохранить в файл с помощью C# сниппета.
Так вот, не получается составить правильный путь xPath . Прошу помочь.
 

specialist

Client
Регистрация
28.12.2018
Сообщения
732
Благодарностей
343
Баллы
63
правильный путь xPath
xml не валидный, может из-за этого ошибки, не могу проверить в валидаторе, тут лучше регуляркой взять конечно.

xpath будет примерно такой (не проверял)
C#:
//div/text()[preceding-sibling::br and following-sibling::b]
 
  • Спасибо
Реакции: soprano

soprano

Client
Регистрация
25.08.2011
Сообщения
862
Благодарностей
930
Баллы
93
Не пошло. Хотел узнать можно ли победить такой xPath.
А регулярку я сделал.
 

specialist

Client
Регистрация
28.12.2018
Сообщения
732
Благодарностей
343
Баллы
63
Можно. Нужен полный код страницы, потому, что //div выбирает все div которые есть на странице.

Если вырезается только этот кусок текста, то учитывайте еще и браузер, firefox версию xpath 2 не полностью поддерживает, нужно переключаться на хром.
 

soprano

Client
Регистрация
25.08.2011
Сообщения
862
Благодарностей
930
Баллы
93
Вот в основном
HTML:
<!DOCTYPE html>
<html lang="en-US">
<body>
<ins class="adsbygoogle"
     style="display:block"
     data-ad-client="ca-pub-9376419406833423"
     data-ad-slot="9010821440"
     data-ad-format="auto"
     data-full-width-responsive="true"></ins>
<script>
</script>
    </body>
</html><div style='overflow-x:auto;'><b>Your code:</b> d3b7d90c3bfc93c82c702110304aaa92a2cc10df552aeb866473d1c7a0072c25 <br/><br/></div> <div style='overflow-x:auto;'>
</div></p>


<p><!-- Mobile Specific Meta -->
    <meta name='viewport' content='width=device-width'>
    <meta name='viewport' content='width=device-width, initial-scale=1'><div style='overflow-x:auto;'>
<table class='data-table'>
<caption class='title'><b>Message History (Last 30 Days)</b></caption>
<thead>
<tr>
<th>No:</th>
<th> To </th>
<th>Message</th>
<th>Date</th>
</tr>
</thead>
<tbody></table></div></p>
<p>
</div>        </div>
            </div>
</body>
</html>
 

backoff

Client
Регистрация
20.04.2015
Сообщения
6 052
Благодарностей
6 481
Баллы
113

soprano

Client
Регистрация
25.08.2011
Сообщения
862
Благодарностей
930
Баллы
93
Да, там еще body был, я вырезал, то лишняя куча кода была бы. Еще один вложенный html был.
 

specialist

Client
Регистрация
28.12.2018
Сообщения
732
Благодарностей
343
Баллы
63

TwistDanceR

Client
Регистрация
30.05.2019
Сообщения
479
Благодарностей
200
Баллы
43
C#:
string test = project.Variables["test"].Value; //Сюда подставляешь Page.Dom: (У меня в "test" был кусок кода из твоего предпоследнего комментария)
//string test = instance.ActiveTab.DomText.ToString(); - вот так подставляется DOM
string regex = @"(?<=<b>Your\ code:</b> )[\w\W]*?(?=<br/>)";
File.WriteAllText(project.Directory+"\\"+"result"+Environment.TickCount+".txt",Regex.Match(test,regex).ToString(),Encoding.UTF8);
Это решение через регулярку, если всегда может быть только одно совпадание. Я художник, я так вижу)))
Если хочешь чтобы с XPath'eм именно - нужно правильно найти по нему элемент и вытянуть innerHtml атрибут через регулярку. Абсолютно таким же макаром. Одна-две строки максимум добавится.

Чтобы ты получил доскональный ответ - лучше скинь URL, я допилю C#. Иначе - сам :-)
 
  • Спасибо
Реакции: soprano

specialist

Client
Регистрация
28.12.2018
Сообщения
732
Благодарностей
343
Баллы
63
как вариант, можно вместо всего этого использовать обычный split, отрезали начало, отрезали конец, оставили результат, пример:

C#:
string code = "<div style='overflow-x:auto;'><b>Your code:</b> d3b7d90c3bfc93c82c702110304aaa92a2cc10df552aeb866473d1c7a0072c25 <br/><br/></div> <div style='overflow-x:auto;'>";
var code_part = code.Split(new string[] { "Your code:</b> " }, StringSplitOptions.None)[1];
var code_part2 = code_part.Split(new string[] { " <br" }, StringSplitOptions.None)[0];
return code_part2;
 

soprano

Client
Регистрация
25.08.2011
Сообщения
862
Благодарностей
930
Баллы
93
Спасибо, я так сделал
C#:
string text = instance.ActiveTab.DomText;
project.Lists["List"].AddRange(Macros.TextProcessing.Regex(text, @"(?<=Your\ code:</b>\ ).*(?=\ <br>)").Select(g => g.FirstOrDefault()));
File.WriteAllLines(project.Directory + @"\base.txt", project.Lists["List"], Encoding.UTF8);
 
  • Спасибо
Реакции: specialist

TwistDanceR

Client
Регистрация
30.05.2019
Сообщения
479
Благодарностей
200
Баллы
43
Спасибо, я так сделал
C#:
string text = instance.ActiveTab.DomText;
project.Lists["List"].AddRange(Macros.TextProcessing.Regex(text, @"(?<=Your\ code:</b>\ ).*(?=\ <br>)").Select(g => g.FirstOrDefault()));
File.WriteAllLines(project.Directory + @"\base.txt", project.Lists["List"], Encoding.UTF8);
Пожалуйста. Не тот комментарий лайкаешь...))
 

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