1

Имеется примерно такой блок, в котором исключительно лежит текст, но в голову не приходит как его спарсить, точнее какой селектор запросить что бы вытащить этот текст, id — всегда разный.

<div id="news-id-10273" style="display:inline;">
    Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
    tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
    quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
    consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
    cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
    proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
</div>

Пробовал так, но не вышло:

newsInfoShort.QuerySelector(".news")
    .QuerySelector(".maincont").QuerySelector("div#news-id-[0-9]{1,9}").TextContent;

UPD: Временное решение, или решение, если нет более удобного способа:

newsInfoShort.QuerySelector(".news").QuerySelector(".maincont").Children
    .First(element => element.Id != null && element.Id.Contains("news-id-")).TextContent;
Denis Bubnov
  • 13,958

1 Answers1

2

Учитывая ваше временное решение, то можно попробовать так div[id^='news-id-'] - будет соответствовать всем идентификаторам, начиная с news-id-. Поэтому ваш QuerySelector должен преобразиться следующим образом:

QuerySelector("div[id^='news-id-']")

Можно использовать QuerySelectorAll вместо QuerySelector, тогда будет коллекция элементов и можно проверять что внутри и сколько. Также будет полезно:

  • [id$='news-id-'] - все идентификаторы, заканчивающимся на news-id-.
  • [id*='news-id-'] - все идентификаторы, содержащие news-id-.

И супер-крутая ссылка, которая очень поможет:

Denis Bubnov
  • 13,958
  • Вот блин, почти так делал, но давно не работал с CSS, забыл что для выборки совпадений, есть ^. Спасибо, так находит, но мне кажется что немного медленнее. –  Dec 27 '17 at 15:07
  • @Birdy Ой, ну касаемо QuerySelector и QuerySelectorAll скажу, что точно QuerySelector работает более эффективно при проходе дерева элементов, так пишут разработчики. А вот по поводу .Children.First не думаю, что он хуже QuerySelector (он работает типо как FirstOrDefault() в LINQ), по идее должен работать на таком же уровне скорости. – Denis Bubnov Dec 27 '17 at 15:15
  • 1
    Ладно, пока остановлюсь на этом, после буду решать вопросы производительности, а за ответ, спасибо! –  Dec 27 '17 at 15:17