2012-04-25 118 views
1

我想取數據並將其組織爲不帶標籤。它看起來是這樣的在java中使用xpath和selenium解析HTML表格數據

<table class="SpecTable"> 
    <col width="40%" /> 
    <col width="60%" /> 
    <tr> 
     <td class="LightRowHead">Optical Zoom:</td> 
     <td class="LightRow">15x</td> 
    </tr> 
    <tr> 
     <td class="DarkRowHead">Digital Zoom:</td> 
     <td class="DarkRow">6x</td> 
    </tr> 
    <tr> 
     <td class="LightRowHead">Battery Type:</td> 
     <td class="LightRow">Alkaline</td> 
    </tr> 
    <tr> 
     <td class="DarkRowHead">Resolution Megapixels:</td> 
     <td class="DarkRow">14 MP</td> 
    </tr> 
</table> 

,我希望能夠提取的信息,所有的字符串,這樣我可以與眼前這個的純文本文件存儲:

光學變焦:15倍數碼變焦:6X電池類型:鹼性分辨率 萬像素:14萬像素

public static void main(String[] args) { 

     FirefoxProfile profile = new FirefoxProfile(); 
     profile.setPreference("general.useragent.override", "some UA string"); 
     WebDriver driver = new FirefoxDriver(profile); 

     String Url = "http://www.walmart.com/ip/Generic-14-MP-X400-BK/19863348"; 
     driver.get(Url); 
     List<WebElement> resultsDiv = driver.findElements(By.xpath("//table[contains (@class,'SpecTable')//td")); 

     System.out.println(resultsDiv.size()); 
     for (int i=0; i<resultsDiv.size(); i++) { 
      System.out.println(i+1 + ". " + resultsDiv.get(i).getText()); 
     } 

我編程在Java中使用Selenium和我想不通正確的XPath表達式。

有人能弄清楚爲什麼我犯這個錯誤,也許給我一些關於如何正確解析這些數據的指針?我對Selenium和XPath非常新,但我需要這個工作。

此外,如果任何人有任何良好的來源,我學習Selenium和XPath快,那些也將不勝感激!

回答

2

也許這會適合您的需要:

string text = driver.findElement(By.cssSelector("table.SpecTable")).getText(); 

字符串text將包含從與類SpecTable表中的所有文本節點。 我更喜歡使用css,因爲它支持IE並且比xpath更快。但至於xpath教程,請嘗試thisthis

5

The spec令人驚訝的是非常好在XPath上很好的讀取。

您也可以嘗試CSS selectors

無論如何,爲了從表中的數據的一種方式可以如下:

// gets all rows 
List<WebElement> rows = driver.findElements(By.xpath("//table[@class='SpecTable']//tr")); 
// for every line, store both columns 
for (WebElement row : rows) { 
    WebElement key = row.findElement(By.XPath("./td[1]")); 
    doAnythingWithText(key.getText()); 
    WebElement val = row.findElement(By.XPath("./td[2]")); 
    doAnythingWithText(val.getText()); 
} 
0

正如你可以抓住表的所有單元格成一個陣列,並訪問他們的方式的另一種選擇。 EG。

ReadOnlyCollection<IWebElement> Cells = driver.FindElements(By.XPath("//table[@class='SpecTable']//tr//td")); 

這將使您將該表中的所有單元格作爲數組獲取,然後您可以使用該數組來迭代訪問文本。

string forOutput = Cells[i].Text; 
-1

CSHARP方法以提取任何表在一個2維數組:

private string[,] getYourSpecTable(){ 
    return getArrayBy(By.CssSelector("table.SpecTable tr"), By.CssSelector("td")); 
} 

private string[,] getArrayBy(By rowsBy, By columnsBy){ 
    bool init=false; 
    int nbRow=0, nbCol=0; 
    string[,] ret = null; 
    ReadOnlyCollection<OpenQA.Selenium.IWebElement> rows = this.webDriver.FindElements(rowsBy); 
    nbRow = rows.Count; 
    for(int r=0;r<nbRow;r++) { 
     ReadOnlyCollection<OpenQA.Selenium.IWebElement> cols = rows[r].FindElements(columnsBy); 
     if(!init) { 
      init= true; 
      nbCol = cols.Count; 
      ret = new string[rows.Count, cols.Count]; 
     }     
     for(int c=0;c<nbCol;c++) { 
      ret[r, c] = cols[c].Text; 
     } 
    } 
    return ret; 
} 
+2

這是一個Java問題,而不是一個問題CSHARP。 – Horcrux7 2012-10-11 18:29:00