Вы можете использовать этот xpath //span[@class="def-price"]/text()
Убедитесь, что вы используете /text()
, а не //text()
. В противном случае он вернет все текстовые узлы внутри тега span.
или
Это css селектор .def-price::text
. При использовании селектора css не используйте .def-price ::text
, он вернет все текстовые узлы, такие как //text()
в xpath.
Использование объекта scrapy response.xpath
from scrapy.http import Request, HtmlResponse as Response
content = '''<span class="def-price" datasku='....'>
<i>$</i>
"999"
<i>.00<i>
</span>'''.encode('utf-8')
url = 'https://stackoverflow.com/questions/62849500'
''' mocking scrapy request object '''
request = Request(url=url)
''' mocking scrapy response object '''
response = Response(url=url, request=request, body=content)
''' using xpath '''
print(response.xpath('//span[@class="def-price"]/text()').extract())
# outputs ['\n ', '\n "999"\n ']
print(''.join(response.xpath('//span[@class="def-price"]/text()').extract()).strip())
# outputs "99"
''' using css selector '''
print(response.css('.def-price::text').extract())
# outputs ['\n ', '\n "999"\n ']
print(''.join(response.css('.def-price::text').extract()).strip())
# outputs "99"
Посмотрите в действии здесь
Используя l xml html parser
from lxml import html
parser = html.fromstring("""
<span class="def-price" datasku='....'>
<i>$</i>
"999"
<i>.00<i>
</span>
"""
)
print(parser.xpath('//span[@class="def-price"]/text()'))
# outputs ['\n ', '\n "999"\n ']
print(''.join(parser.xpath('//span[@class="def-price"]/text()')).strip())
# outputs "999"
Посмотреть в действии здесь