【问题标题】:Parsing HTML table data with xpath and selenium in java在java中使用xpath和selenium解析HTML表格数据
【发布时间】:2012-05-06 14:56:56
【问题描述】:

我想获取数据并在没有标签的情况下对其进行组织。它看起来像这样

<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 倍数码变焦:6 倍电池类型:碱性分辨率 百万像素: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 中使用 Selenium 进行编程,但我无法为它找出正确的 XPath 表达式。

有人能弄清楚我为什么会犯错,或许能给我一些关于如何正确解析这些数据的指示吗?我对 Selenium 和 XPaths 很陌生,但我需要这个来工作。

另外,如果有人有任何好的资源让我快速学习 Selenium 和 XPath,我们也将不胜感激!

【问题讨论】:

    标签: java html xpath selenium webdriver


    【解决方案1】:

    这可能会满足您的需求:

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

    String text 将包含来自具有类 SpecTable 的表中的所有文本节点。 我更喜欢使用css,因为它受IE 支持并且比xpath 更快。但是对于 xpath 教程,请尝试 thisthis

    【讨论】:

      【解决方案2】:

      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());
      }
      

      【讨论】:

        【解决方案3】:

        作为另一种选择,您可以将表格的所有单元格抓取到一个数组中并以这种方式访问​​它们。 例如。

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

        这会将表格中的所有单元格作为一个数组获取,然后您可以使用它来迭代地访问文本。

        string forOutput = Cells[i].Text;
        

        【讨论】:

          【解决方案4】:

          提取二维数组中任意表的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;
          }
          

          【讨论】:

          • 这是一个 Java 问题,而不是 csharp 问题。
          猜你喜欢
          • 2015-07-28
          • 2014-11-15
          • 2012-07-19
          • 2012-08-23
          • 2011-06-03
          • 1970-01-01
          • 2019-09-04
          • 2014-07-13
          • 2017-05-04
          相关资源
          最近更新 更多