我正在尝试从网页中的表中提取数据,但我不断提取相同的信息。例如,我将每部电影都放在一个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来提取信息,还是有另一种方式?
答案 0 :(得分:1)
我认为我理解你的问题。您想要从网页中的所有表格中读取电影的名称。
我没有在我的机器上测试过这个..这是你可以尝试的代码。
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的值以访问其他表格。它不是很漂亮但它有效。再次感谢您的帮助。