selenium 如何处理table .

本文介绍如何使用Selenium WebDriver获取HTML表格中特定单元格的文本值。通过自定义方法getCellText,实现对表格数据的精确读取。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://blog.youkuaiyun.com/gzh0222/article/details/7568490

以前在selenium RC 里面有一个getTable方法,是得到一个单元格中的文本。其详细描述如下:


Java代码   收藏代码
  1. /** Gets the text from a cell of a table. The cellAddress syntax <span style="white-space: normal; background-color: #ffffff;">tableLocator.row.column</span> 
  2. , where row and column start at 0. 
  3. @param tableCellAddress a cell address, e.g. <span style="white-space: normal; background-color: #ffffff;">"foo.1.4"</span> 
  4. @return the text from the specified cell 
  5. */  
  6. String getTable(String tableCellAddress);  

 

就是传入一个参数,这个参数的格式必须是tableLocator.row.column,如"foo.1.4",foo用于得到table对象,1.4代表在table里第1行第4列。行、列从0开始。

 

在selenium webdriver里,没有这样的方法,也就是说没有专门操作table的类。但我们可以自己封闭一个,这并不难。以上面的getTable方法为例,我们自己也可以创建这样功能的一个方法。

 

Java代码   收藏代码
  1. public String getCellText(By by,String tableCellAddress)  

 

 我叫它getCellText,它有两个参数,第一个是By对象用于得到table对象, tableCellAddress 如"1.4",代表在table里第1行第4列。行、列从0开始。

以下面html代码为例:

 

Html代码   收藏代码
  1. <html>  
  2.     <head>  
  3.         <title>Table</title>  
  4.           
  5.     </head>  
  6.     <body>  
  7.         <table border="1" id="myTable">  
  8.             <tr>  
  9.                 <th>Heading(row 0 ,cell 0)</th>  
  10.                 <th>Another Heading(row 0 ,cell 1)</th>  
  11.                 <th>Another Heading(row 0 ,cell 2)</th>  
  12.             </tr>  
  13.             <tr>  
  14.                 <td>row 1, cell 0</td>  
  15.                 <td>row 1, cell 1</td>  
  16.                 <td>row 1, cell 2</td>  
  17.             </tr>  
  18.             <tr>  
  19.                 <td>row 2, cell 0</td>  
  20.                 <td>row 2, cell 1</td>  
  21.                 <td>row 2, cell 2</td>  
  22.             </tr>  
  23.         </table>  
  24.     </body>  
  25. </html>  

 

 

 

示例代码如下:

 

Java代码   收藏代码
  1. import java.util.List;  
  2. import org.openqa.selenium.By;  
  3. import org.openqa.selenium.NoSuchElementException;  
  4. import org.openqa.selenium.WebDriver;  
  5. import org.openqa.selenium.WebElement;  
  6. import org.openqa.selenium.firefox.FirefoxDriver;  
  7.   
  8. public class Table {  
  9.   
  10.     /** 
  11.      * @author gongjf 
  12.      */  
  13.     private WebDriver driver;  
  14.     Table(WebDriver driver){  
  15.         this.driver = driver;  
  16.     }  
  17.       
  18.     /** 从一个table的单元格中得到文本值. 参数tableCellAddress的格式为 
  19.     row.column, 行列从0开始. 
  20.     @param by  用于得到table对象 
  21.     @param tableCellAddress 一个单元格地址, 如. "1.4" 
  22.     @return 从一个table的单元格中得到文本值 
  23.     */  
  24.     public String getCellText(By by,String tableCellAddress) {  
  25.         //得到table元素对象  
  26.         WebElement table = driver.findElement(by);  
  27.         //对所要查找的单元格位置字符串进行分解,得到其对应行、列。  
  28.         int index = tableCellAddress.trim().indexOf('.');  
  29.         int row =  Integer.parseInt(tableCellAddress.substring(0, index));  
  30.         int cell = Integer.parseInt(tableCellAddress.substring(index+1));  
  31.         //得到table表中所有行对象,并得到所要查询的行对象。  
  32.          List<WebElement> rows = table.findElements(By.tagName("tr"));  
  33.          WebElement theRow = rows.get(row);  
  34.          //调用getCell方法得到对应的列对象,然后得到要查询的文本。  
  35.          String text = getCell(theRow, cell).getText();  
  36.          return text;  
  37.     }  
  38.     private WebElement getCell(WebElement Row,int cell){  
  39.          List<WebElement> cells;  
  40.          WebElement target = null;  
  41.          //列里面有"<th>"、"<td>"两种标签,所以分开处理。  
  42.          if(Row.findElements(By.tagName("th")).size()>0){  
  43.             cells = Row.findElements(By.tagName("th"));  
  44.             target = cells.get(cell);  
  45.          }  
  46.          if(Row.findElements(By.tagName("td")).size()>0){  
  47.             cells = Row.findElements(By.tagName("td"));  
  48.             target = cells.get(cell);  
  49.          }  
  50.         return target;  
  51.            
  52.     }  
  53.       
  54.       
  55.     public static void main(String[] args) {  
  56.          WebDriver driver;  
  57.          System.setProperty("webdriver.firefox.bin","D:\\Program Files\\Mozilla Firefox\\firefox.exe");    
  58.          driver = new FirefoxDriver();  
  59.          driver.get("file:///C:/Documents and Settings/Gongjf/桌面/selenium_test/table.html");  
  60.       
  61.          Table table = new Table(driver);  
  62.          By by = By.id("myTable");  
  63.          String address = "0.2";  
  64.        
  65.          System.out.println(table.getCellText(by, address));  
  66.           
  67.           
  68.     }  
  69.   
  70. }  

 运行代码将输出

 

Java代码   收藏代码
  1. Another Heading(row 0 ,cell 2)  
# # -*- coding: utf-8 -*- # 数据爬取文件 import scrapy import pymysql import pymssql from ..items import ErshoufanginfoItem import time from datetime import datetime,timedelta import datetime as formattime import re import random import platform import json import os import urllib from urllib.parse import urlparse import requests import emoji import numpy as np from DrissionPage import Chromium import pandas as pd from sqlalchemy import create_engine from selenium.webdriver import ChromeOptions, ActionChains from scrapy.http import TextResponse from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support.wait import WebDriverWait import pandas as pd from sqlalchemy import create_engine from selenium.webdriver import ChromeOptions, ActionChains from scrapy.http import TextResponse from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support.wait import WebDriverWait # 二手房信息 class ErshoufanginfoSpider(scrapy.Spider): name = 'ershoufanginfoSpider' spiderUrl = 'https://gy.anjuke.com/sale/p{}/' start_urls = spiderUrl.split(";") protocol = '' hostname = '' realtime = False def __init__(self,realtime=False,*args, **kwargs): super().__init__(*args, **kwargs) self.realtime = realtime=='true' def start_requests(self): plat = platform.system().lower() if not self.realtime and (plat == 'linux' or plat == 'windows'): connect = self.db_connect() cursor = connect.cursor() if self.table_exists(cursor, 's6036zs0_ershoufanginfo') == 1: cursor.close() connect.close() self.temp_data() return pageNum = 1 + 1 for url in self.start_urls: if '{}' in url: for page in range(1, pageNum): next_lin这段代码用什么库来解析网页
最新发布
03-25
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值