我正在尝试xpath解析包含以下行的HTML文档:
<td class="ficha ficha_izq">Emisiones de CO<sub>2</sub> (gr/km)</td>
我正在使用scrapy,结果是:
[<Selector xpath='//td[contains(@class,"ficha_izq")]/node()' data=u'Emisiones de CO'>, <Selector xpath='//td[contains(@class,"ficha_izq")]/node()' data=u'<sub>2</sub>'>, <Selector xpath='//td[contains(@class,"ficha_izq")]/node()' data=u' (gr/km)'>]
所以,三件而不是一件。我不介意标签,所以如何获得包含以下内容的单个项目
Emisiones de CO2 (gr/km)
这不是一个案例,我有几个包含标签的项目,所以我需要一些编程解决方案。
有任何线索吗?
谢谢!
注意:使用text()而不是node()没有帮助:
[<Selector xpath='//td[contains(@class,"ficha_izq")]/text()' data=u'Emisiones de CO'>, <Selector xpath='//td[contains(@class,"ficha_izq")]/text()' data=u' (gr/km)'>]
答案 0 :(得分:1)
此xpath应该有效//td[contains(text(),'Emisiones de CO')]/node()
答案 1 :(得分:1)
使用w3lib.html.remove_tags
。您可以将其与ItemLoader
一起使用。
In [1]: html = '<td class="ficha ficha_izq">Emisiones de CO<sub>2</sub> (gr/km)</td>'
In [2]: sel = Selector(text=html)
In [3]: map(remove_tags, sel.xpath('//td').extract())
Out[3]: [u'Emisiones de CO2 (gr/km)']
使用XPath或CSS选择器的替代方案:
In [4]: u''.join(sel.xpath('//td[contains(@class,"ficha_izq")]//text()').extract())
Out[4]: u'Emisiones de CO2 (gr/km)'
In [5]: u''.join(sel.css('td.ficha_izq ::text').extract())
Out[5]: u'Emisiones de CO2 (gr/km)'
请注意td.ficha_izq
和::text
之间的空格,::text
CSS伪元素是CSS选择器的Scrapy扩展。