2012-04-25 25 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 MP

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でプログラミングしていると私は把握することはできませんそれに対する正しいXPath式。

誰かが私がこれを間違っている理由を理解して、このデータを正しく解析する方法を教えてもらえますか?私はセレンとXPathsに非常に新しいですが、私は仕事のためにこれが必要です。

また、誰かが私のために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もお試しください。

とにかく、テーブルからデータを取得するための1つの方法は、以下のようになります

// 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

を使用すると、1つのアレイにテーブルのすべてのセルを取得し、それらをそのようにアクセスすることができる別の選択肢として。 EG。

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

これにより、そのテーブル内のすべてのセルが配列として取得され、テキストに繰り返しアクセスすることができます。 2次元アレイ内の任意のテーブルを抽出する

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

CSHARP方法:

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

関連する問題