使用相同的类名提取表数据

时间:2014-06-19 18:11:01

标签: java selenium xpath

我正在尝试从网页中的表中提取数据,但我不断提取相同的信息。例如,我将每部电影都放在一个arraylist中,但我希望将每部电影与相关的表格数据相匹配。问题是,每个表都有相同的类名。我能够打印每个电影标题,但我只是在拉电影的桌面信息。以下是第一和第二部电影的HTML示例:

    <TH CLASS="ddtitle">MovieOne</TH>
        <TABLE  CLASS="datadisplaytable" ><CAPTION class="captiontext">Movies</CAPTION>
    <TR>
    <TH CLASS="ddheader" scope="col" >Genre</TH>
    <TH CLASS="ddheader" scope="col" >Time</TH>
    <TH CLASS="ddheader" scope="col" >Days</TH>
    <TH CLASS="ddheader" scope="col" >Where</TH>
    <TH CLASS="ddheader" scope="col" >Date Range</TH>
    <TH CLASS="ddheader" scope="col" >Seating</TH>
    <TH CLASS="ddheader" scope="col" >Actors</TH>
    </TR>
    <TR>
    <TD CLASS="dddefault">Action</TD>
    <TD CLASS="dddefault">10:00 am - 12:00 pm</TD>
    <TD CLASS="dddefault">SMTWTHFSA</TD>
    <TD CLASS="dddefault">AMC Showplace</TD>
    <TD CLASS="dddefault">Aug 20, 2014 - Sept 12, 2014</TD>
    <TD CLASS="dddefault">Reservations</TD>
    <TD CLASS="dddefault">Will Ferrel (<ABBR title= "Primary">P</ABBR>)  target="Will Ferrel" ></TD>
    </TR>
    </TABLE>
<TH CLASS="ddtitle">MovieTwo</TH>
        <TABLE  CLASS="datadisplaytable" ><CAPTION class="captiontext">Movies</CAPTION>
    <TR>
    <TH CLASS="ddheader" scope="col" >Genre</TH>
    <TH CLASS="ddheader" scope="col" >Time</TH>
    <TH CLASS="ddheader" scope="col" >Days</TH>
    <TH CLASS="ddheader" scope="col" >Where</TH>
    <TH CLASS="ddheader" scope="col" >Date Range</TH>
    <TH CLASS="ddheader" scope="col" >Seating</TH>
    <TH CLASS="ddheader" scope="col" >Actors</TH>
    </TR>
    <TR>
    <TD CLASS="dddefault">Action</TD>
    <TD CLASS="dddefault">11:00 am - 12:30 pm</TD>
    <TD CLASS="dddefault">SMTWTHFSA</TD>
    <TD CLASS="dddefault">Showplace Cinemas</TD>
    <TD CLASS="dddefault">Aug 20, 2014 - Sept 12, 2014</TD>
    <TD CLASS="dddefault">TBA</TD>
    <TD CLASS="dddefault">Zach Galifinakis (<ABBR title= "Primary">P</ABBR>)  target="Zach Galifinakis" ></TD>
    </TR>
    </TABLE>

这是我一直在尝试的(由我的另一个问题Extract Text from BR tags提供Praveen):

 WebElement table =driver.findElement(By.xpath("//table[@class='datadisplaytable']"));
   WebElement tbody=table.findElement(By.tagName("tbody"));
   List<WebElement> rows=tbody.findElements(By.tagName("tr"));
   System.out.println("Row  size:"+rows.size());
   ArrayList<String> list=new ArrayList<>();

   for(int i=0;i<rows.size();i++)
   {
     WebElement column = tbody.findElement(By.xpath("//table[@class='datadisplaytable']/tbody/tr[2]/td"));
     if(column.getText().trim().contains("."))
     {
        System.out.println("text : "+column.getText().trim());
        list.add(column.getText().trim());
     }

   }

我也能够以字符串形式获取表信息,但我需要将每个表元素分开。我可以使用子字符串,但信息会有所不同,因此字符串长度也会有所不同。我应该使用xpath来提取信息,还是有另一种方式?

3 个答案:

答案 0 :(得分:1)

我认为我理解你的问题。您想要从网页中的所有表格中读取电影的名称。

  1. 阅读所有表格
  2. 循环它们并在表格的每一行中,获取第二列(假设有电影名称)
  3. 我没有在我的机器上测试过这个..这是你可以尝试的代码。

    List<WebElement> tables = driver.findElements(By.className("ddtitle"));
    
    foreach(WebElement table : tables){
    
       List<WebElement> rows = table.findElements(By.tagName("TR"));
    
       foreach(WebElement row : rows){
           WebElement movieName = row.findElements(By.tagName("TD")).get(2); // column # in row
           System.out.println(movieName);
       }
    }
    

答案 1 :(得分:0)

您可以使用前面的<TR>来区分每个表,从而更改限制所选表的上下文的XPath表达式。例如,此表达式只会选择 second 表:

//table[@class='datadisplaytable'][preceding-sibling::th[1]='MovieTwo']/tbody/tr[2]/td

(假设电影标题不同)

表达式//table/preceding-sibling:th[1]选择最近的<th>元素。其上下文由具有class属性datadisplaytable的所有表格组成。谓词进一步限制仅设置为具有包含字符串值table的前一个<th>的{​​{1}}个元素。

如果你知道几部电影的名字,你可以在电影名称的位置使用一个变量,然后分别遍历每个表格,选择你想要处理的电影。

答案 2 :(得分:0)

我可以使用

获取第一个表格信息
WebElement movieinfo = driver.findElement(By.xpath("//table[@class='datadisplaytable']/descendant::table["+tcounter+"]//td[1]"));

tcounter是一个int值= 1.

然后我更改了td [1]的值以获取其他单元格并增加tcounter的值以访问其他表格。它不是很漂亮但它有效。再次感谢您的帮助。