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

kui*_*ong 7 html python 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>
Run Code Online (Sandbox Code Playgroud)

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

Cri*_*scu 6

这是我设法做的:

from scrapy.selector import Selector

sel = Selector(text = html_string)

for node in sel.css('a *::text'):
    print node.extract()
Run Code Online (Sandbox Code Playgroud)

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

   text in a

text in b


text in c




text in b

   text in a

text in c
Run Code Online (Sandbox Code Playgroud)

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

  • 该解决方案收集文本,而不是innerHTML。 (3认同)

pau*_*rth 5

您可以在选择的元素上使用XPath的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']
>>> 
Run Code Online (Sandbox Code Playgroud)