2012-07-25 46 views
0

注意:自從給出一些早期答案以來,問題已更新。這仍然是同樣的問題,只是希望更清楚。需要幫助編寫xpath字符串以匹配多個(但不是全部)表格單元格

我試圖讓一個網站刮板正常工作,我有問題想出一些合適的xpath字符串的一些表格單元格。

<tbody> 
    <tr> 
    <td class="Label" width="20%" valign="top">Uninteresting section</td> 
    <td class="Data"> I don't care about this</td> 
    </tr> 
    <tr> 
    <td></td> 
    <td class="Data"> I don't care about this</td> 
    </tr> 
    <tr> 
    <td class="Label" width="20%" valign="top">Interesting section</td> 
    <td class="Data"> I want this-1</td> 
    </tr> 
    <tr> 
    <td></td> 
    <td class="Data"> I want this-2</td> 
    </tr> 
    <tr> 
    <td></td> 
    <td class="Data"> I want this-n</td> 
    </tr> 
    <tr> 
    <td class="Label" width="20%" valign="top">Uninteresting section</td> 
    <td class="Data"> I don't care about this</td> 
    </tr> 
    <tr> 
    <td></td> 
    <td class="Data"> I don't care about this</td> 
    </tr> 
</tbody> 

我想要感興趣的部分中的所有數據字段的內容。 可以有任意數量的這些。我不關心代碼中的其他內容,但我需要所有這些。

在上面的例子: 我想這-1 我想這-2 我想這正

如果是相關的,我使用xml.dom.minidom和PY-DOM-的XPath與Python 2.7。

+0

// tr [@ class =「Entry」] // tr ...你正在尋找嵌套在另一個tr中的tr? – 2012-07-25 14:06:35

+0

有一個桌子裏面有更多的桌子,我留下了一些結構,因爲我已經可以匹配它了。我的問題是我上面發佈的部分,我不知道如何獲取此特定部分中的數據單元的所有內容,而無需從其他部分獲取它們。標籤單元格的內容是使各部分在匹配方面不同的唯一內容,所有部分的結構都是相同的。 – LJNielsenDk 2012-07-25 14:55:22

回答

1

你可以得到該部分之後的所有nds(包括其他部分)

//tr[@class="Entry"]//tr/td[contains(text(), "Section title")]/following::td[@class = "Data"]/text() 

然後你就可以得到下一個部分的所有m個TDS你不

//tr[@class="Entry"]//tr/td[contains(text(), "Section title")]/following::td[@class="Label"][1]/following::td[@class = "Data"]/text() 

想,然後就可以在Python中使用的前n - 米TDS。

您可以嘗試與位置做同樣的XPath和計數功能:

//tr[@class="Entry"]//tr/td[contains(text(), "Section title")]/following::td[@class = "Data"][position() <= (count(//tr[@class="Entry"]//tr/td[contains(text(), "Section title")]/following::td[@class = "Data"]/text()) - count(//tr[@class="Entry"]//tr/td[contains(text(), "Section title")]/following::td[@class="Label"][1]/following::td[@class = "Data"]/text()))]/text() 

如果你有XPath 2.0中,你可以做到這一點優雅與except操作:

//tr[@class="Entry"]//tr/td[contains(text(), "Section title")]/following::td[@class = "Data"]/text() except //tr[@class="Entry"]//tr/td[contains(text(), "Section title")]/following::td[@class="Label"][1]/following::td[@class = "Data"]/text() 
+0

我無法獲得第三個選項,我沒有XPath 2.0,但是兩個第一個將會完成這項工作:)謝謝。 – LJNielsenDk 2012-07-25 18:47:19

+0

看起來像3中的(...)構造,需要XPath 2.0。如果位置檢查在/ text()之前移動,它可能會起作用。 (我會編輯它) – BeniBela 2012-07-25 21:56:29

0
//tr[@class="Entry"]/td[@class="Data"]/text() 
+0

這並不好,它不會將其限制在我想要的部分。 – LJNielsenDk 2012-07-25 14:50:49

0
//tbody[tr/td[contains(text(),"Section title")]]/tr/td[@class="Data"]/text() 

更新。該做些什麼:

  1. 獲取tbodytrtd包含「欄目標題」

  2. 從這些獲取每個td的文本用C lass="Data"

+0

不完全。這隻會匹配第一個單元格,其他單元不在同一個單元格中。我已經更新了問題中的代碼片段,以使其更清晰。 – LJNielsenDk 2012-07-25 17:43:51

+0

不清楚你正在嘗試做什麼,但據我瞭解,_tbody_有很多_tbody_,只有第一行有「標籤」 – 2012-07-25 18:17:32

+0

我已經更新了問題中的代碼片斷,現在應該更清楚了。 – LJNielsenDk 2012-07-25 18:43:53

相關問題