如何在Scrapy中将CSS选择器转换为XPath?

时间:2019-01-22 21:10:36

标签: css xpath scrapy

我想在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中,我在列表中多次获得了相同的引号。我在做什么错了?

1 个答案:

答案 0 :(得分:1)

  

“在CSS路径中,我获得了不同引号的信息,而在XPath中,列表中多次获得了相同的引号。我在做什么错了?”

主要问题是由于XPath在表达式的开头将/解释为对根文档的引用,与执行表达式的上下文元素无关。您想通过在开头添加quote来明确地告诉您要在当前上下文元素(变量.所引用的元素)上执行表达式,例如:

text = quote.xpath('.//span[@class="text"]/text()').extract_first()