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

问题描述 投票:0回答:3

我正在使用 xidel 并玩网络抓取(目前没有模板)。 我想获得一本书的标题和价格及其价格,以便每个条目都可以打印在一行上:

标题 --> 价格

根据这个论坛的答案我可以写:

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

但是如何在一行中写标题和价格?

谢谢

shell xquery xidel
3个回答
1
投票

试试

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

0
投票

我听从了 Martin 的建议并检查了 html 结构,代码中确实有一个应该使用的 Article 元素。 Martin 解决方案有效,我可能同时想到的是:

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

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

问题解决了


0
投票

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

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

$ 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>
-元素节点的直接子节点,而不是后代(
.//
不是必需的)。因为它是你正在处理的所有(文本)节点,所以你不需要真的需要
!
简单的地图运算符):

$ 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自己的extended-string-syntax.

© www.soinside.com 2019 - 2024. All rights reserved.