用于在单个字符串中获取每个段落文本的正确xpath / css是什么?

时间:2014-03-15 19:34:48

标签: python xpath scrapy

首先我创建一个HtmlResponse并使用scrapy读取它:

from scrapy.http import HtmlResponse
from scrapy.selector import Selector

body = """
<div class="a">
  <p>
      text1<br> text2
  </p>
</div>
<div class="a">
    <p>
         text3
    </p>
</div>
 """
response = HtmlResponse(url='http://example.com/', body=body)
sel = Selector(response)

现在,我想从这个html中提取文本但是我得到一个包含2个元素的列表。这是我到目前为止所尝试的:

 sel.xpath('//div[@class="a"]/p/text()').extract()
 # [u'\n      text1', u' text2\n  ', u'\n         text3\n    ']

你注意到我得到2个段落的3个文本元素?如何才能获得2个文本元素?

  [u'text1 text2',u'text3']

请注意,我不想使用BeautifulSoup,因为此处需要提高性能。

2 个答案:

答案 0 :(得分:2)

使用CSS选择器(包括Scrapy&#39; ::text扩展名):

>>> from scrapy.http import HtmlResponse
>>> from scrapy.selector import Selector
>>> 
>>> body = """
... <div class="a">
...   <p>
...       text1<br> text2
...   </p>
... </div>
... <div class="a">
...     <p>
...          text3
...     </p>
... </div>
...  """
>>> response = HtmlResponse(url='http://example.com/', body=body)
>>> sel = Selector(response)
>>> [u''.join(paragraph.css('::text').extract()).strip() for paragraph in sel.css('div.a > p')]
[u'text1 text2', u'text3']
>>> 

答案 1 :(得分:0)

我使用理解来得到这个解决方案,也许别人可以有更好的选择:

[''.join(x.xpath('./text()').extract()) for x in sel.xpath('//div[@class="a"]/p')]

## [u'\n      text1 aa\n  ', u'\n         text3\n    ']