我正在使用 xidel 并玩网络抓取(目前没有模板)。 我想获得一本书的标题和价格及其价格,以便每个条目都可以打印在一行上:
标题 --> 价格
根据这个论坛的答案我可以写:
./xidel -e 'doc("https://books.toscrape.com")//*[self::p[@class="price_color"] or self::h3]'
但是如何在一行中写标题和价格?
谢谢
试试
./xidel -e 'doc("https://books.toscrape.com")//article[@class = "product_pod"]!(.//h3 || "-->" || .//p[@class="price_color"])'
我听从了 Martin 的建议并检查了 html 结构,代码中确实有一个应该使用的 Article 元素。 Martin 解决方案有效,我可能同时想到的是:
./xidel -e 'doc("https://books.toscrape.com")//article ! string-join((.//p[@class="price_color"], .//h3), ";")'
需要记住:先检查HTML结构!
问题解决了
需要记住:先检查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.