解析
xpath提取所有节点文本
我左青龙,
右白虎,
- 上朱雀,
- 下玄武。
使用xpath的string(.)
#!/usr/bin/env python
-- coding: utf-8 --
from scrapy.selector import Selector
text = ‘
我左青龙,
右白虎,
- 上朱雀,
- 下玄武。
’
s = Selector(text=text)
data = s.xpath(’//div[@id=“test3”]’)
info = data.xpath(‘string(.)’).extract()[0]
print(info)
s = Selector(text=text)
data = s.xpath(’//div[@id=“test3”]’)
info = data.xpath(‘string(.)’).extract()[0]
print(info)
output: 我左青龙,右白虎,上朱雀,下玄武。老牛在当中,龙头在胸口。
1.具体代码如下:
>>> from scrapy.selector import Selector
>>> text = '<div id="test3">我左青龙,<span id="tiger">右白虎,<ul>上朱雀,<li>下玄武。</li></ul>老牛在当中,</span>龙头在胸口。<div>'
>>> Selector(text=text)
<Selector xpath=None data='<html><body><div id="test3">我左青龙,<span i'>
>>> s=Selector(text=text)
>>> data=s.xpath('//div[@id="test3"]')
>>> data
[<Selector xpath='//div[@id="test3"]' data='<div id="test3">我左青龙,<span id="tiger">右白'>]
>>> info=data.xpath('string(.)').extract()[0]
>>> info
'我左青龙,右白虎,上朱雀,下玄武。老牛在当中,龙头在胸口。'
>>> info1=data.xpath('string(.)')
>>> info1
[<Selector xpath='string(.)' data='我左青龙,右白虎,上朱雀,下玄武。老牛在当中,龙头在胸口。'>]
>>> info2=data.xpath('string(.)').extract()
>>> info2
['我左青龙,右白虎,上朱雀,下玄武。老牛在当中,龙头在胸口。']
>>> info3=data.xpath('string(.)').extract()[0]
>>> info3
'我左青龙,右白虎,上朱雀,下玄武。老牛在当中,龙头在胸口。'
>>>
>>>> "".join(s.xpath('//div[@id="test3"]//text()').extract())
'我左青龙,右白虎,上朱雀,下玄武。老牛在当中,龙头在胸口。'
2 同时选择多个属性
c=response.xpath(’//div[@class=“visa_table_info”][@data-key=“1”]’)
注意 response.xpath(’//div’) 标示根目录下所有div (包括直接和间接div) response.xpath(’/div’)直接div
如何解决详情页面元素改变
这个问题是这样产生的,在很多PC站,比如链家,这个页面有这些字段A,但是下个页面这个字段A没了,取而代之的是字段B,在xpath定位时就失效了。这个问题很常见,大体思路是这样的。
创建一个包含所有字段的dict: data = {}.fromkeys((‘url’, ‘price’, ‘address’))
然后根据网页中是否有字段来取值,例如,有’url’就取对应的value,没有则为空
这样就可以完美解决匹配不全问题
参考:https://blog.csdn.net/qq_41888542/article/details/81213824