我正在使用xidel和玩网页抓取(现在没有模板).我想得到一本书的标题和价格及其价格,这样他们就可以打印在一行为每个条目:标题--〉价格根据这个论坛的回答,我可以写:
./xidel -e 'doc("https://books.toscrape.com")//*[self::p[@class="price_color"] or self::h3]'
但是如何将标题和价格写在一行中呢?谢谢你
n9vozmp41#
试试看
./xidel -e 'doc("https://books.toscrape.com")//article[@class = "product_pod"]!(.//h3 || "-->" || .//p[@class="price_color"])'
ogsagwnx2#
如果一个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操作符):
<article>
.//
!
$ xidel -s "https://books.toscrape.com" -e ' //article/join((div/p[@class="price_color"],h3),";") '
就我个人而言,我只使用x:join()/string-join()来组合3个或更多的项目。对于2个项目,我总是做一个简单的字符串连接:
x:join()
string-join()
$ 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自己的扩展字符串语法。
vhipe2zx3#
我按照马丁的建议,并检查了html结构,确实有一个文章元素在代码中,应该使用。马丁的解决方案的作品和一个我来到可能在同一时间是:
./xidel -e 'doc("https://books.toscrape.com")//article ! string-join((.//p[@class="price_color"], .//h3), ";")'
需要记住:首先检查HTML结构!问题已解决
3条答案
按热度按时间n9vozmp41#
试试看
ogsagwnx2#
如果一个HTML源代码被缩小了,或者被美化了(例如,有很多不合逻辑的缩进),那么为了更好地查看所有元素节点,我建议使用以下两个命令之一:
然后你会很快注意到,你所寻找的文本节点是
<article>
-element-node的直接子节点,而不是后代节点(.//
不是必需的)。而且因为你正在处理的都是(文本)节点,所以你并不需要!
(简单的Map操作符):就我个人而言,我只使用
x:join()
/string-join()
来组合3个或更多的项目。对于2个项目,我总是做一个简单的字符串连接:最后一个是Xidel自己的扩展字符串语法。
vhipe2zx3#
我按照马丁的建议,并检查了html结构,确实有一个文章元素在代码中,应该使用。马丁的解决方案的作品和一个我来到可能在同一时间是:
需要记住:首先检查HTML结构!
问题已解决