首先我创建一个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
,因为此处需要提高性能。
答案 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 ']