2016-09-19 26 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

相關問題