Xidel: Как обрабатывать несколько результатов с одного узла? - PullRequest
1 голос
/ 16 июня 2020

Скажем, у нас есть код:

xidel -s https://www.example.com -e '(//span[@class="number"])'

, а результат:

111111
222222
333333

могу я сделать это ниже?

for ((n=1;n<=3;n++))
do
   a=$(xidel -s https://www.example.com -e '(//span[@class="number"]) [$n]')
   b=$a+1
   echo $b
done

I ожидайте, что он напечатает 3 отредактированных числа, например:

111112
222223
333334

было бы немного абсурдно загружать веб-страницу 3 раза, но причина здесь в том, чтобы обрабатывать каждое значение вывода одно за другим, используя ForL oop.

Ответы [ 2 ]

1 голос
/ 17 июня 2020

xidel полностью поддерживает XPath / XQuery 3.0 (поддержка XPath / XQuery 3.1 находится в разработке), поэтому вы можете использовать все функции и фильтры, которые он может предложить.
Я могу порекомендовать следующие веб-сайты:


Без « Минимальный воспроизводимый пример » Я просто помещу ваш вышеупомянутый результат в последовательность и покажу вам несколько примеров.

xidel -se 'let $a:=(111111,222222,333333) return $a ! (. + 1)'
#or
xidel -se 'for $x in (111111,222222,333333) return $x + 1'
111112
222223
333334
xidel -se 'let $a:=("a abc","a sdf","a wef","a vda","a gdr") return $a ! substring-after(.,"a ")'
#or
xidel -se 'let $a:=("a abc","a sdf","a wef","a vda","a gdr") return $a ! replace(.,"a ","")'
#or
xidel -se 'for $x in ("a abc","a sdf","a wef","a vda","a gdr") return substring-after($x,"a ")'
#or
xidel -se 'for $x in ("a abc","a sdf","a wef","a vda","a gdr") return replace($x,"a ","")'
abc
sdf
wef
vda
gdr
1 голос
/ 16 июня 2020

Пример кода:

$ aa=$(xidel -se '//span[@class="random"]' 'https://www.example.com')
$ echo $aa

Допустим, результат xidel следующий:

a abc
a sdf
a wef
a vda
a gdr

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

Мы можем использовать формулу For Loop следующим образом:

#"a " is the one we want to remove, so make variable for this prefix
a="a "

for ((n=-1;n>=-5;n--))
do
 #process the extraction by selecting which line first
   bb=$(echo "$aa" | head $n | tail -1)
 #then remove the prefix after that
   bb=${aa/#$a}
   echo $bb

done

Это напечатает:

abc
sdf
wef
vda
gdr

Бонус

#"a " is the one we want to remove, so make variable for this prefix
a="a "

for ((n=-1;n>=-5;n--))
do
 #process the extraction by selecting which line first
   bb=$(echo "$aa" | head $n | tail -1)
 #then remove the prefix after that
   bb=${aa/#$a}
 #echo everything except 2nd line
 if [ $n != -2 ] ; then
 echo $bb
 fi

done

Будет напечатано:

abc
wef
vda
gdr

Любой другой ввод приветствуется

...