shell 将变量用作XPath表达式,非预期行为

vsaztqbk  于 2023-03-13  发布在  Shell
关注(0)|答案(1)|浏览(174)

为了解析reddit.com,我使用

xidel -e '//div[@data-click-id="background"]/div[@data-adclicklocation="title"]/div/a[@data-click-id="body"]/@href|//div[@data-click-id="background"]/div[@data-adclicklocation="title"]/div/a[@data-click-id="body"]/div/h3/text()' "https://www.reddit.com/r/bash"

因此,基本XPath重复了2次,然后我决定使用xidel变量:

xidel -se 'xp:=//div[@data-click-id="background"]/div[@data-adclicklocation="title"]/div/a[@data-click-id="body"]' \
    -e '$xp/@href|$xp/div/h3/text()' 'https://www.reddit.com/r/bash'

但输出与先前命令不同。
奖金,如果有人可以给予一个方法来删除\n串联,但空间串联,尝试fn:string-join()fn:concat()没有雪茄。
也尝试了|| " " ||,但不是每个匹配项的预期url <description>

kmbjn2e3

kmbjn2e31#

如果添加了--extract-exclude=xp,输出也不会有什么不同,请参见我的答案here,特别是自述文件中的引用。
你可能会看到:

xp := set -x is your friend
Homework questions.
Need some help with bash to combine two lists
Sshto update
Cannot pipe the output to a file
Worked a lot on this script lately

这些是XPath表达式中的文本节点,它实际上保存了元素节点,但是--output-node-format=text毕竟是默认的。
不过这种情况下确实不需要这种内部变量,我个人只在导出系统变量时使用,如果你 * 想 * 使用变量,使用FLWOR表达式:

$ xidel -s "https://www.reddit.com/r/bash" -e '
  for $x in //div[@data-adclicklocation="title"]/div/a[@data-click-id="body"] return
  ($x/@href,$x/div/h3)
'

$ xidel -s "https://www.reddit.com/r/bash" -e '
  let $a:=//div[@data-adclicklocation="title"]/div/a[@data-click-id="body"] return
  $a/(@href,div/h3)
'

但最简单的查询(不需要变量)可能是:

$ xidel -s "https://www.reddit.com/r/bash" -e '
  //div[@data-adclicklocation="title"]/div/a[@data-click-id="body"]/(@href,div/h3)
'

字符串连接非常简单:

-e '.../join((@href,div/h3))'
-e '.../concat(@href," ",div/h3)'
-e '.../(@href||" "||div/h3)'
-e '.../x"{@href} {div/h3}"'

对于||,不要忘记括号,否则div/h3没有上下文项。
最后一个是Xidel自己的扩展字符串语法。
或者,您可以解析这个巨大的JSON,它会列出更多Reddit问题:

$ xidel -s "https://www.reddit.com/r/bash" -e '
  parse-json(
    extract(//script[@id="data"],"window.___r = (.+);",1)
  )//posts/models/*[not(isSponsored)]/join((permalink,title))
'

相关问题