Scrapy Xpath with text()包含

时间:2016-10-11 02:46:47

标签: xpath scrapy

我正在使用scrapy,我正在尝试寻找包含特定文本的跨度。我有:

response.selector.xpath('//*[@class="ParamText"]/span/node()')

返回:

<Selector xpath='//*[@class="ParamText"]/span/text()' data=u' MILES STODOLINK'>,
<Selector xpath='//*[@class="ParamText"]/span/text()' data=u'C'>,

<Selector xpath='//*[@class="ParamText"]/span/text()' data=u'  MILES STODOLINK'>]

但是当我跑步时:

>>> response.selector.xpath('//*[@class="ParamText"]/span[contains(text(),"STODOLINK")]')
Out[11]: []

为什么包含功能不起作用?

3 个答案:

答案 0 :(得分:11)

contains()无法一次评估多个节点:

/span[contains(text(),"STODOLINK")]

因此,如果span中有多个文本节点,而"STODOLINK"中的span不在{em> contains() 的第一个文本节点子节点中,然后上面表达式中的contains()将无效。您应该尝试对单个文本节点应用//*[@class="ParamText"]/span[text()[contains(.,"STODOLINK")]] 检查,如下所示:

"STODOLINK"

或者如果span不一定直接位于span内(可以嵌套在.中的其他元素中),那么您只需使用text()代替//*[@class="ParamText"]/span[contains(.,"STODOLINK")]

select max(id),Staff_name from position group by Staff_name

答案 1 :(得分:2)

在我的终端中(假设我的示例与您的文件相同),您的代码可以正常工作:

<强>输入

import scrapy
example='<div class="ParamText"><span>STODOLINK</span></div>'
scrapy.Selector(text=example).xpath('//*[@class="ParamText"]/span[contains(text(),"STODOLINK")]').extract()

<强>输出:

['<span>STODOLINK</span>']

你能澄清一下可能有什么不同吗?

答案 2 :(得分:1)

我使用Scrapy with BeautifulSoup4.0。 IMO,Soup易于阅读和理解。如果您不必使用HtmlXPathSelector,则可以选择此选项。以下是查找所有链接的示例。您可以用'span'替换它。希望这有帮助!

import scrapy
from bs4 import BeautifulSoup
import Item

def parse(self, response):

    soup = BeautifulSoup(response.body,'html.parser')
    print 'Current url: %s' % response.url
    item = Item()
    for link in soup.find_all('a'):
        if link.get('href') is not None:
            url = response.urljoin(link.get('href'))
            item['url'] = url
            yield scrapy.Request(url,callback=self.parse)
            yield item