我是 scrapy 的新手。我想从网上抓取一些数据。我得到了如下的html文档。
dom style1:
<div class="user-info">
<p class="user-name">
something in p tag
</p>
text data I want
</div>
dom style2:
<div class="user-info">
<div>
<p class="user-img">
something in p tag
</p>
something in div tag
</div>
<div>
<p class="user-name">
something in p tag
</p>
text data I want
</div>
</div>
我想获取数据我想要的文字数据,现在我可以使用 css 或 xpath 选择器通过检查得到它存在。但我想知道一些更好的方法。
例如,我可以首先获得css p.user-name
,然后我获得它的父级,然后我得到它div/text()
,并且始终是我想要的数据是text()
的直接父p.user-name
的{{1}},但问题是,如何获得直接父div
?
答案 0 :(得分:4)
使用xpath,您可以在每个方向(父,兄弟,孩子等)遍历xml树,其中css不支持此。
对于您的情况,您可以使用xpath ..
父表示法获取节点的父级:
//p[@class='user-name']/../text()
说明:
//p[@class='user-name']
- 查找类别为<p>
的{{1}}个节点
user-name
- 选择节点的父级
/..
- 选择当前节点的文本。
此xpath应该适用于您描述的两种情况。
答案 1 :(得分:1)
使用following-sibling
轴怎么样?
>>> s = scrapy.Selector(text='''<div class="user-info">
... <p class="user-name">
... something in p tag
... </p>
... text data I want
... </div>''')
>>> username = s.css('p.user-name')[0]
>>> username.xpath('following-sibling::text()[1]').get()
'\n text data I want\n'
>>>
>>> s2 = scrapy.Selector(text='''<div class="user-info">
... <div>
... <p class="user-img">
... something in p tag
... </p>
... something in div tag
... </div>
... <div>
... <p class="user-name">
... something in p tag
... </p>
... text data I want
... </div>
... </div>''')
>>> username = s2.css('p.user-name')[0]
>>> username.xpath('following-sibling::text()[1]').get()
'\n text data I want\n '
>>>