Xpath: Как выбрать 1-е и 2-е число отдельно в предложении - PullRequest
0 голосов
/ 08 апреля 2020

У меня есть проект, в котором мне нужно анализировать веб-страницу для ежедневных обновлений и распечатывать их в моей электронной таблице. Я использую =importXML() Мне нужны только два числа, которые содержатся в одном предложении (подзаголовок). Вот пример

<div class="col-sm-12 text-18 line-height-27">

  <h2>Header</h2>

  <p class="text-18">
      <strong>21 some words 234 another few words</strong>
  </p> 
  <p class="text-18">
    Some content ... 
  </p>


  <h2>Header 2</h2>

  <p class="text-18">
      <strong>12 some words 144 another few words</strong>
  </p> 
  <p class="text-18">
    Some old content ... 
  </p>

  //and it goes on and on


</div>

Мне нужно извлечь только числа 21 и 234 отдельно, напечатанные в каждом собственная ячейка, где мои другие функции электронных таблиц используют их для других таблиц.

Я могу легко выбрать все предложение с помощью

//div/p[1]/strong

, но после этого я не знаю, как разбить предложение. Есть ли способ выбрать только 1 и 2 числа из предложения? Может ли XPath сделать это? Может быть, мне лучше разбить предложение и извлечь числа по формулам электронной таблицы Google?

Ответы [ 3 ]

0 голосов
/ 09 апреля 2020

Это должно работать, если в предложении присутствуют только буквы и цифры. В противном случае вам нужно будет настроить REGEX. Это удаляет все буквы от a до z и не учитывает регистр.

=split(REGEXREPLACE(IMPORTXML(url,xpath_query),"(?i)[a-z]","")," ")
0 голосов
/ 09 апреля 2020

Один вкладыш с REGEXEXTRACT (SPLIT не требуется):

=REGEXEXTRACT(IMPORTXML(yourURL;"//div/p[1]/strong");"(\d+).+\s(\d+)")
0 голосов
/ 08 апреля 2020

Вы можете легко сделать это с помощью функции fn:replace в XPath-2.0 (которая не поддерживается Google).

Чтобы добиться этого в XPath-1.0, вы должны использовать некоторые приемы. Ниже приведен только один подход, который сильно зависит от возможных значений:

concat(substring-before(normalize-space(translate(/div/p[1]/strong,'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ,;.:-/','')),' '),' - ',substring-after(normalize-space(translate(/div/p[1]/strong,'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ,;.:-/','')),' '))

Этот подход заменяет все символы a..z и A..Z (и некоторые знаки пунктуации) на пустой символ. Числа остаются, и они разделяются на fn:substring-before(...) и fn:substring-after(...).

Это довольно сложно, и не работает в случаях, когда не все символы совпадают.

In В этом примере выводом является

21 - 234

...