2011-03-17 45 views
0

我是新來的Xpath,試圖scrapy網站下面的格式:Scrapy,蟒蛇,Xpath的如何匹配相應項目在HTML

<div class="top"> 
    <a> tittle_name </a> 
    <div class="middle"> listed_date </div> 
    <div class="middle"> listed_value </div> 
</div> 
<div class="top"> 
    <a> tittle_name </a> 
    <div class="middle"> listed_date </div> 
</div> 
<div class="top"> 
    <a> tittle_name </a> 
    <div class="middle"> listed_value </div> 
</div> 

listed_value & listed_date的派駐都是可選的。

我需要將每個tittle_name與各自的listed_date,listed_value(如果可用)進行分組,然後向MySQL插入到達記錄。

我使用scrapy shell這給像

listings = hxs.select('//div[@class=\'top\']') 
for listing in listings: 
    tittle_name = listing.select('/a//text()').extract() 
    date_values = listing.select('//div[@class=\'middle\']') 

上面代碼中一些基本的例子給我tittle_name和可用listed_date的名單,listed_value,的名單,但如何搭配他們? (由於格式不對稱,我們無法按索引進行搜索)。

謝謝。

回答

0

那麼,由於網站沒有指定div[@class='middle']中的某個內容是日期還是值,因此您必須編碼自己的方式來決定這一點。

我猜日期有一些特定的格式,你可以用一些分析來匹配,也許使用正則表達式。

您能否更具體地瞭解listed_datelisted_value的可能值?

+0

是的,您是對的。能夠決定listed_date&listed_value。但是每個tittle_name可能具有listed_date或listed_value,可能同時具有兩個或者可能沒有。格式不是對稱的。因此,從上面的Python代碼列表中,我不知道如何在嘗試插入MySQL時將tittle_name與各自的listed_date,listed_value進行匹配。也許需要不同的方法? – learnJQueryUI 2011-03-18 06:26:23

0

請注意,這些XPath表達式是絕對的:

/a//text() 

//div[@class=\'middle\'] 

你會需要相對XPath表達式這樣的:

a 

div[@class=\'middle\'] 

二。在混合內容模型(如(X)HTML)中選擇文本節點並不是一個好主意。您應該使用適當的DOM方法或使用string()函數來提取字符串值。 (在最後一種情況下,您需要爲每個節點評估表達式,因爲將隱式節點集合鑄造爲單獨節點集合)

+0

我認爲這裏沒有相對或絕對路徑問題,因爲我從列表中調用了「// div [@class = \'middle \']」,這是列表的結果= hxs.select('// div [@ class = \'最佳\']')。感謝text&string()中的註釋,稍後我將在稍後改進代碼時研究它。我真的不明白你最後一句話。這是一個建議,以匹配每個節點的相關條目。如果是的話,你可以更具體一些。 – learnJQueryUI 2011-03-18 06:29:25