如何在python中使用scrapy获得直接父节点?

时间:2017-06-07 16:42:34

标签: python xpath scrapy web-crawler parent-child

我是 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

2 个答案:

答案 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    '
>>>