shell 如何打印不同字段的组合值?

mefy6pfw  于 2023-03-30  发布在  Shell
关注(0)|答案(3)|浏览(97)

我正在使用xidel和玩网页抓取(现在没有模板).我想得到一本书的标题和价格及其价格,这样他们就可以打印在一行为每个条目:
标题--〉价格
根据这个论坛的回答,我可以写:

./xidel -e 'doc("https://books.toscrape.com")//*[self::p[@class="price_color"] or self::h3]'

但是如何将标题和价格写在一行中呢?
谢谢你

n9vozmp4

n9vozmp41#

试试看

./xidel -e 'doc("https://books.toscrape.com")//article[@class = "product_pod"]!(.//h3 || "-->" || .//p[@class="price_color"])'
ogsagwnx

ogsagwnx2#

  • 需要记住:先检查HTML结构!*

如果一个HTML源代码被缩小了,或者被美化了(例如,有很多不合逻辑的缩进),那么为了更好地查看所有元素节点,我建议使用以下两个命令之一:

$ xidel -s "https://books.toscrape.com" -e . --output-node-format=xml --output-node-indent
$ xidel -se 'serialize(doc("https://books.toscrape.com"),{"indent":true()})'

然后你会很快注意到,你所寻找的文本节点是<article>-element-node的直接子节点,而不是后代节点(.//不是必需的)。而且因为你正在处理的都是(文本)节点,所以你并不需要!(简单的Map操作符):

$ xidel -s "https://books.toscrape.com" -e '
  //article/join((div/p[@class="price_color"],h3),";")
'

就我个人而言,我只使用x:join()/string-join()来组合3个或更多的项目。对于2个项目,我总是做一个简单的字符串连接:

$ xidel -s "https://books.toscrape.com" -e '
  //article/(div/p[@class="price_color"]||";"||h3)
'
$ xidel -s "https://books.toscrape.com" -e '
  //article/concat(div/p[@class="price_color"],";",h3)
'
$ xidel -s "https://books.toscrape.com" -e '
  //article/x"{div/p[@class="price_color"]};{h3}"
'

最后一个是Xidel自己的扩展字符串语法。

vhipe2zx

vhipe2zx3#

我按照马丁的建议,并检查了html结构,确实有一个文章元素在代码中,应该使用。马丁的解决方案的作品和一个我来到可能在同一时间是:

./xidel -e 'doc("https://books.toscrape.com")//article ! string-join((.//p[@class="price_color"], .//h3), ";")'

需要记住:首先检查HTML结构!
问题已解决

相关问题