如何使用scrapy Selector获取节点的innerHTML?

时间:2015-02-22 12:58:04

标签: python html xpath css-selectors scrapy

假设有一些html片段如:

<a>
   text in a
   <b>text in b</b>
   <c>text in c</c>
</a>
<a>
   <b>text in b</b>
   text in a
   <c>text in c</c>
</a>

其中我想在标签中提取文本但在保留文本时排除这些标签,例如,我想在上面提取的内容就像&#34;文本在c&#34;和&#34;文本公司中的b文本中的文本&#34;。现在我可以使用scrapy Selector css()函数获取节点,那么我怎么能继续这些节点来获得我想要的呢?任何想法都将不胜感激,谢谢!

4 个答案:

答案 0 :(得分:6)

这是我设法做的事情:

from scrapy.selector import Selector

sel = Selector(text = html_string)

for node in sel.css('a *::text'):
    print node.extract()

假设html_string是一个在你的问题中持有html的变量,这段代码产生以下输出:

   text in a

text in b


text in c




text in b

   text in a

text in c

选择器a *::text()匹配作为a个节点后代的所有文本节点。

答案 1 :(得分:4)

您可以对所选元素使用XPath's string()功能:

$ python
>>> import scrapy
>>> selector = scrapy.Selector(text="""<a>
...    text in a
...    <b>text in b</b>
...    <c>text in c</c>
... </a>
... <a>
...    <b>text in b</b>
...    text in a
...    <c>text in c</c>
... </a>""", type="html")
>>> for link in selector.css('a'):
...     print link.xpath('string(.)').extract()
... 
[u'\n   text in a\n   text in b\n   text in c\n']
[u'\n   text in b\n   text in a\n   text in c\n']
>>> 

答案 2 :(得分:1)

尝试

response.xpath('//a/node()').extract()

答案 3 :(得分:0)

在scrapy 1.5中,您可以使用/*来获取innerhtml。 例如:

content = response.xpath('//div[@class="viewbox"]/div[@class="content"]/*').extract_first()