2016-09-19 78 views
0

我正在创建一个新的scrapy蜘蛛,并且一切都很顺利,虽然我遇到了其中一个网站的问题,其中response.xpath正在返回列表中的对象“T HTML代码中存在:Scrapy中的XPath返回不存在的元素

{"pdf_name": ["\n\t\t\t\t\t\t\t\t\t", "ZZZZZZ", "\n\t\t\t\t\t\t\t\t\t", "PDF", "\n\t\t\t\t\t\t\t\t"], 
{"pdf_name": ["\n\t\t\t\t\t\t\t\t\t\t", "YYYYYY", "\n\t\t\t\t\t\t\t\t\t\t", "XXXXXX"]} 

正如你可以看到下面,这些 “空” 的对象(\ t和\ n)不包含在HTML标签。如果我理解正确,XPath是包括标签前的空格:

<div class="inner d-i-b va-t" role="group"> 
         <a class="link-to" href="A.pdf" target="_blank"> 
            <i class="offscreen">ZZZZZZ</i> 
            <span>PDF</span> 
           </a> 

           <div class="text-box"> 
            <a href="A.pdf"> 
             <i class="offscreen">YYYYYY</i> 
             <p>XXXXXX</p></a> 
           </div> 
          </div> 

我知道我可以带()的字符串,并删除空格,尽管这只是缓解了问题,而不是删除的主要问题,这是包括结果中有空白。

为什么会发生?如何将XPath结果限制为标签(我之前认为它是默认完成的)?

蜘蛛代码 - 解析函数(pdf_name导致的问题)

def parse(self, response): 

    # Select all links to pdfs 
    for pdf in response.xpath('//a[contains(@href, ".pdf")]'): 
     item = PdfItem() 

     # Create a list of text fields for links to PDFs and their descendants 
     item['pdf_name'] = pdf.xpath('descendant::text()').extract() 

     yield item 
+0

由于操作符是JSON格式,因此您会看到\ t和\ n。如果您将它们加载到数据库中,您将拥有必要的空白区域。 – Backtrack

+0

感谢@Backtrack的信息。问题是我不想有空格,也不\ n - 它不应该包含在结果中。我正在寻找标签中的文字,而不是在他们之外格式化。任何想法如何改善这一点? – Starid

+0

这里是一个例子:http://stackoverflow.com/questions/5992177/what-is-the-difference-between-normalize-space-and-normalize-spacetext – Backtrack

回答

2

空白是文档的一部分。只是因为认为这并不重要,不会让它消失。

文本节点是一个文本节点,它是否由' '(空格字符)或其他任何字符组成都没有差别。

您可以用normalize-space()的XPath功能正常化空白:

def parse(self, response): 
    for pdf_link in response.xpath('//a[contains(@href, ".pdf")]'): 
     item = PdfItem() 
     item['pdf_name'] = pdf_link.xpath('normalize-space(.)').extract() 
     yield item 

首先,normalize-space()将其参数转换为字符串,它是通过将所有后代文本节点完成。然后修剪前导和尾随空格,并将任何连续的空白(包括换行符)合并到一个空格中。像这样的'\n bla \n\n bla '会变成'bla bla'

+0

谢谢你的宝贵意见和答案! – Starid

相关问题