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