Selenium Chrome C# 抓取指定TD标签内容问题求助
解决Selenium C#只提取表格中姓名列的问题
我来帮你搞定这个问题!你现在的代码会遍历每一行里的所有<td>元素,所以姓名和手机号都会被添加到DataGridView里。要只提取姓名,我们只需要定位每行的**第一个<td>**就行——因为网页结构里每行的第一个td正好对应Contact Name列。
这里有两种简单的修改方案:
方案1:直接取每行td列表的第一个元素
FindElements(By.TagName("td"))返回的是按DOM顺序排列的元素列表,我们直接取索引为0的元素就是姓名:
var table = selenium1.driver().FindElement(By.TagName("tbody")); var rows = table.FindElements(By.TagName("tr")); foreach (var row in rows) { var rowTds = row.FindElements(By.TagName("td")); // 确保存在td元素,避免索引越界 if (rowTds.Count > 0) { var nameTd = rowTds[0]; this.Invoke(new MethodInvoker(delegate () { dataGridView1.Rows.Add(nameTd.Text); })); } }
方案2:用CSS选择器精准定位第一个子td
用td:first-child这个CSS选择器,可以直接定位到每行的第一个td元素,代码更简洁:
var table = selenium1.driver().FindElement(By.TagName("tbody")); var rows = table.FindElements(By.TagName("tr")); foreach (var row in rows) { try { var nameTd = row.FindElement(By.CssSelector("td:first-child")); this.Invoke(new MethodInvoker(delegate () { dataGridView1.Rows.Add(nameTd.Text); })); } catch (NoSuchElementException) { // 处理没有找到元素的情况,比如跳过该行 continue; } }
这两种方法都能帮你只提取姓名列的内容,不会再把手机号加进去啦。建议加上异常处理或者判断,避免因为网页结构变化导致程序报错。
内容的提问来源于stack exchange,提问作者Ilyas Zahir
相关产品推荐
相关产品推荐

