如何使用某些特定标签获取文字'在python中scrapy一起标记在一起?

时间:2017-06-08 06:19:08

标签: python xpath web-scraping scrapy selector

我是 scrapy 的新手。我想从网上抓取一些数据。我得到了如下的html文档。

<div class="user-info">
    <p class="user-img">
        something in p tag
    </p>
    <em>text</em> data I want
    <a href="#">
        something in a tag
    </a>
</div>

我想获得我想要的文本数据。但文字位于代码<em></em>中。因此,如果我使用div[contains(@class, "user-info")]/text(),我只能获得我想要的数据。如果我使用div[contains(@class, "user-info")]/node(),我会获得div.user-info内的所有标记,以及div[contains(@class, "user-info")]/node()/text()。所以问题是,如何将文本数据一起作为我想要的文本数据

3 个答案:

答案 0 :(得分:0)

尝试在XPath下面使用以连接两个必需的文本节点:

concat(//div[@class="user-info"]/em/text(), " ", //div[@class="user-info"]/text()[3])

答案 1 :(得分:0)

如果您想要<p class="user-img">之后和<a href="#">something in a tag</a>之前的所有节点,则可以使用following axis

  

以下轴包含与文档顺序中的上下文节点之后的上下文节点在同一文档中的所有节点,不包括任何后代并排除属性节点和命名空间节点

>>> s = scrapy.Selector(text='''<div class="user-info">
...     <p class="user-img">
...         something in p tag
...     </p>
...     <em>text</em> data I want
...     <a href="#">
...         something in a tag
...     </a>
... </div>''')
>>> s.css('p.user-img')
[<Selector xpath="descendant-or-self::p[@class and contains(concat(' ', normalize-space(@class), ' '), ' user-img ')]" data='<p class="user-img">\n        something i'>]

>>> s.css('p.user-img').xpath('following::text()[following::a]').getall()
['\n    ', 'text', ' data I want\n    ']

>>> ''.join(s.css('p.user-img').xpath('following::text()[following::a]').getall())
'\n    text data I want\n    '

答案 2 :(得分:-1)

我将<em></em>替换为"",然后使用div[contains(@class, "user-info")]/text()