我想在Scrapy项目中将CSS选择器转换为XPath。
我正在从其网站教程中学习Scrapy,并且在将CSS语言直接转换为XPath时遇到麻烦。
用于解析http://quotes.toscrape.com/的CSS选择器是:
`>>> for quote in response.css("div.quote"):
... text = quote.css("span.text::text").extract_first()
... author = quote.css("small.author::text").extract_first()
... tags = quote.css("div.tags a.tag::text").extract()
... print(dict(text=text, author=author, tags=tags))`
我尝试使用XPath编写:
In [83]: for quote in response.xpath('//div[@class="quote"]'):
...: text = quote.xpath('//span[@class="text"]/text()').extract_first()
...: author = quote.xpath('//small[@class="author"]/text()').extract_first()
...: tags= quote.xpath('//div[@class="tags"]/a[@class="tag"]/text()').extract()
...: print(dict(text=text,author=author,tags=tags))`
在CSS路径中,我得到有关不同引号的信息,而在XPath中,我在列表中多次获得了相同的引号。我在做什么错了?
答案 0 :(得分:1)
“在CSS路径中,我获得了不同引号的信息,而在XPath中,列表中多次获得了相同的引号。我在做什么错了?”
主要问题是由于XPath在表达式的开头将/
解释为对根文档的引用,与执行表达式的上下文元素无关。您想通过在开头添加quote
来明确地告诉您要在当前上下文元素(变量.
所引用的元素)上执行表达式,例如:
text = quote.xpath('.//span[@class="text"]/text()').extract_first()