【问题标题】:How to get immediate parent node with scrapy in python?如何在python中使用scrapy获取直接父节点?
【发布时间】:2017-11-09 03:33:36
【问题描述】:

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

我想获取我想要的文本数据,现在我可以使用cssxpath 选择器通过检查它是否存在来获取它。但我想知道一些更好的方法。 比如我可以先得到cssp.user-name,然后得到it's parent,然后得到div/text(),而我想要的数据总是@987654325的text() @的直系父母div,但问题是,我怎样才能得到直系父母p.user-name

【问题讨论】:

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


    【解决方案1】:

    使用 xpath,您可以在 css 不支持的每个方向(父、兄弟、子等)上遍历 xml 树。
    对于您的情况,您可以使用 xpath .. parent 表示法获取节点的父节点:

    //p[@class='user-name']/../text()
    

    说明:
    //p[@class='user-name'] - 查找类值为 user-name&lt;p&gt; 节点。
    /.. - 选择节点的父节点。
    /text() - 选择当前节点的文本。

    此 xpath 应该适用于您描述的两种情况。

    【讨论】:

      【解决方案2】:

      使用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    '
      >>> 
      

      【讨论】:

      • 谢谢,但是 dom 比我给出的要复杂得多。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-13
      • 1970-01-01
      • 2012-08-04
      • 1970-01-01
      • 2014-12-25
      • 2023-03-14
      相关资源
      最近更新 更多