我正在使用 Selenium 和 Python 来抓取网站。结果未知,因此我不能只是硬编码来查找特定值(在本例中为“UDAR”等四个字母的车辆代码)。页面成功加载后,我能够成功地抓取我想要的所有数据,但 HTML 中的一个字段除外。该字段值实际上在网页上不可见(屏幕截图 1),但我知道它的存在是为了在 HTML 中标记/分类数据(屏幕截图 2“UDAR”)。
我尝试过很多事情。我尝试仅抓取一个特定元素并打印 .text,但无济于事。我试图获取这种类型的所有元素(这就是我想要的),并循环遍历它们。我尝试过通过标签名称、类名称,获取更高级别的“vehicle-item_summary-container”类甚至更高级别的部分,希望我可以解析出我想要的数据(4个字母代码,例如“UDAR”这个案例)。 当我查找元素时,所有这些选项都只返回一个空字符串,或者如果我查找元素,则返回一个空字符串数组。我没有尝试通过 xpath 进行引用,因为页面上返回的汽车通常不在顺序,所以你的 xpath 可以像 7, 1, 2, 3, 4, 5, 6, 8 或 9, 1, 2, 3, 4, ..... 不想尝试进入一些硬核映射从我可以检索的其他字段值返回 xpath。
vehicle_code=driver.find_elements(By.CLASS_NAME, "vehicle-item__tour-info")
vehicle_code=driver.find_elements(By.TAG_NAME, "p")
您要查找的文本被隐藏,因为样式
vehicle-item__tour-info
包含设置为 display: none
的属性,因此 Selenium 无法看到它。
因此,在提取文本值之前,我们需要更改该属性:
driver.execute_script('$(".vehicle-item__tour-info").css("display","block")')
elem = driver.find_elements(By.CLASS_NAME, 'vehicle-item__tour-info')
tour_info = [i.text for i in elem]
# Output
['MVAR', 'ECAR', 'CCAR', 'CFAR', 'IFAR', 'IFDR', 'ICAR', 'ICAE', 'SPAR', 'SCAR', 'SFAR', 'SFDR', 'FCAR', 'PPAR', 'FFAR', 'RFAR', 'FJAR', 'UFAR', 'PFAR', 'IJAR', 'SGAR', 'SGDR', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '']
如您所见,它没有获取不可用车辆的值。这很容易解决:只需在提取数据之前单击探索替代可能性。
另一种方法可能更容易。由于您的
HTML
页面源中已包含所有数据,因此使用一行 regex
即可轻松获取数据。这将为您提供所有数据,包括不可用的车辆。
import re
data = re.findall('(?<=<p class="vehicle-item__tour-info">).+?(?=</p>)', driver.page_source)
# Output
['MVAR', 'ECAR', 'CCAR', 'CFAR', 'IFAR', 'IFDR', 'ICAR', 'ICAE', 'SPAR', 'SCAR', 'SFAR', 'SFDR', 'FCAR', 'PPAR', 'FFAR', 'RFAR', 'FJAR', 'UFAR', 'PFAR', 'IJAR', 'SGAR', 'SGDR', 'XXAR', 'FCAH', 'CFAE', 'CFDR', 'PCAR', 'PDAR', 'PXAR', 'LCAR', 'PGAR', 'PGDR', 'FFDR', 'PFDR', 'SKDR', 'RKDR', 'UKDR', 'SPBR', 'PPAE', 'PPBR', 'PPBE', 'SSAR', 'STAR', 'GXAR', 'WXAR', 'UDAR', 'WDAR', 'PQAR', 'OFAR', 'WFAR', 'WFAE', 'SKAR', 'RKAR']