【问题标题】:How to extract only text from the div containing more divs using scrapy如何使用scrapy从包含更多div的div中仅提取文本
【发布时间】:2013-10-15 07:14:45
【问题描述】:

我有一个包含更多子元素的 div 元素。我只想从该 div 的所有子元素中获取文本。是否有任何内置功能或scrapy属性。

示例: 我需要从http://www.jabong.com/z-collection-Olive-Mocassins-376735.html刮掉面包屑

从 : 面包屑中抓取内容的 div id 期望输出:首页 > 男装 > 鞋履 > 休闲鞋 > 莫卡辛鞋 > 橄榄色莫卡辛鞋

【问题讨论】:

    标签: python scrapy


    【解决方案1】:

    您可以使用HtmlXPathSelector 和 XPath 表达式选择 ID 为“breadcrumbs”的div 的所有后代文本节点,例如id("breadcrumbs")//text()

    为了说明这一点,我将使用scrapy shell 命令,它会为您提供一个HtmlXPathSelector 实例hxs

    paul@wheezy:~$ scrapy shell http://www.jabong.com/z-collection-Olive-Mocassins-376735.html
    ...
    2013-10-15 09:30:06+0200 [default] DEBUG: Crawled (200) <GET http://www.jabong.com/z-collection-Olive-Mocassins-376735.html> (referer: None)
    [s] Available Scrapy objects:
    [s]   hxs        <HtmlXPathSelector xpath=None data=u'<html><head><meta http-equiv="Content-Ty'>
    ...
    In [1]: hxs.select('id("breadcrumbs")//text()').extract()
    Out[1]: 
    [u'\r\n                                    ',
     u'Home',
     u'\r\n                                                ',
     u'>',
     u'\r\n                                                                                                ',
     u'Men',
     u'\r\n                                                ',
     u'>',
     u'\r\n                                                                                                ',
     u'Shoes',
     u'\r\n                                                ',
     u'>',
     u'\r\n                                                                                                ',
     u'Casual Shoes',
     u'\r\n                                                ',
     u'>',
     u'\r\n                                                                                                ',
     u'Moccasins',
     u'\r\n                                                ',
     u'>',
     u'\r\n                                                                                                ',
     u'Olive Mocassins',
     u'\r\n                                                         \r\n',
     u'\r\n        ',
     u'\r\n\r\n        ']
    

    如果您需要去除这些空白字符,您可以使用 map()unicode.strip

    In [2]: map(unicode.strip, hxs.select('id("breadcrumbs")//text()').extract())
    Out[2]: 
    [u'',
     u'Home',
     u'',
     u'>',
     u'',
     u'Men',
     u'',
     u'>',
     u'',
     u'Shoes',
     u'',
     u'>',
     u'',
     u'Casual Shoes',
     u'',
     u'>',
     u'',
     u'Moccasins',
     u'',
     u'>',
     u'',
     u'Olive Mocassins',
     u'',
     u'',
     u'']
    
    In [3]: 
    

    您可以使用 filter() 删除这些空行

    In [4]: filter(bool, map(unicode.strip, hxs.select('id("breadcrumbs")//text()').extract()))
    Out[4]: 
    [u'Home',
     u'>',
     u'Men',
     u'>',
     u'Shoes',
     u'>',
     u'Casual Shoes',
     u'>',
     u'Moccasins',
     u'>',
     u'Olive Mocassins']
    
    In [5]: 
    

    这是一个将面包屑作为单个字符串获取的单行方法,再次使用 str.join()map()

    In [9]: ' '.join(map(unicode.strip, hxs.select('id("breadcrumbs")//text()').extract())).strip()
    Out[9]: u'Home  >  Men  >  Shoes  >  Casual Shoes  >  Moccasins  >  Olive Mocassins'
    

    甚至:

    In [10]: ' '.join(filter(bool, map(unicode.strip, hxs.select('id("breadcrumbs")//text()').extract())))
    Out[10]: u'Home > Men > Shoes > Casual Shoes > Moccasins > Olive Mocassins'
    

    【讨论】:

    • 这就是我一直在寻找的...我循环并连接
    • @user2129794,我用.join()的解决方案更新了我的答案@
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-06
    • 2019-10-05
    • 1970-01-01
    • 1970-01-01
    • 2021-01-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多