xpath
  • scrapy
  • 2016-10-11 81 views 3 likes 
    3

    我正在使用scrapy,我试图寻找包含特定文本的跨度。我有:带有文本()的Scrapy Xpath包含

    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]: [] 
    

    为什么包含的功能无法正常工作?

    回答

    8

    不能同时评估多个节点:

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

    所以,万一有在span内的多个文本节点,并"STODOLINK"位于span的第一个文本子节点,则上述表达式中的将不起作用。你应该尝试单独的文本节点上应用检查如下:

    //*[@class="ParamText"]/span[text()[contains(.,"STODOLINK")]] 
    

    或者,如果"STODOLINK"不一定直接位于内span(可以嵌套在其他元素中的span),那么你可以简单地使用.而不是text()

    //*[@class="ParamText"]/span[contains(.,"STODOLINK")] 
    
    +0

    谢谢,我可以问一下'。'意味着这里。我在“正则表达式”中猜测“任何字符”? – user61629

    +0

    它是对元素本身的引用。另外,'..'是对元素父元素的引用;它们像* nix系统(Linux,Mac等)文件路径一样工作,其中“。”是当前目录,'..'是父目录。 –

    1

    在我的终端(假设我的例子是相同的文件虽然)你的代码工作:

    输入

    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>'] 
    

    你能澄清一下可能会有所不同?

    1

    我使用Scrapy和BeautifulSoup4.0。 IMO,汤很容易阅读和理解。如果您不必使用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 
    
    相关问题