xpath
  • scrapy
  • 2016-10-11 90 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 
    
    相關問題