2014-02-18 72 views
0

我想使用scrapy從此表中提取一些書鏈接。Scrapy:表中鏈接的xpath

表看起來像這樣:

<table id="table_text"> 

<tbody> 

<tr > 
<td>15/02/2014</td> 
<td><a href="/book_1.html">Book 1</a></td> 
<td>The Author</td> 
<td> <a href="/tag1">tag1</a> <a href="/tag2">tag2</a> </td> 
<td>Genre</td> 
</tr> 

和所提取的鏈路應該是:

/book_1.html 

,我使用的是

def parse(self, response): 
    hxs = Selector(response) 
    hxs = Selector(response) 
    links = hxs.xpath('//table[@id="table_text"]//tr//td[2]//a//@href') 

print links選擇器顯示一個空輸出:[]

我想知道我用的xpath有什麼問題?

+0

一個完整的重現器(也就是說,我們可以運行自己重現的東西)會更有幫助。該頁面是否公開? –

+0

順便說一句,你使用的是比你需要更多的''''。其中許多隻會是單跳。 –

+1

您可以用//表格[@ id =「table_text」] // tr/td [2]/a/@ href'進行簡化,但是您已經描述了XPath正在運行的內容。你能給更多的上下文嗎?更多HTML?你是否在'response'中檢查了body * *實際上是你認爲的那個(瀏覽器可以顯示與scrapy檢索的不同的HTML,比如JS的例子)? – Robin

回答

2

根據您提供的信息,您的XPath工作正常。它可以簡化爲

//table[@id="table_text"]//tr/td[2]/a/@href 

但您的版本返回正確的節點。

使用scrapy遇到意外的行爲時,請儘量檢查它收到的HTML是否是您期望的。 使用瀏覽器和scrapy檢索的HTML可能與不同,因爲scrapy不處理Javascript(並且某些瀏覽器嘗試清理HTML)。

這就是爲什麼你應該檢查response.body的內容是你所期望的。如果不是,你需要找到一個解決方法:)