我是 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()
。所以问题是,如何将文本和数据一起作为我想要的文本数据?
答案 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()