python - Python Selenium 随机行为 - findElement 有时有效,有时与看似相同的代码无关
问题描述
使用 Selenium、Python、Pandas 抓取 autotrader.co.uk。我想要列出车辆的统计数据表,但由于某种原因,事实证明它比我想象的要困难......
完整代码在这里:pastebin链接
似乎有时无法识别“标题”和“价格”元素,但它与 html 上的代码完全相同:
工作项的 HTML(行索引 1):
<section class="product-card-pricing">
<div class="product-card-pricing__content">
<div class="product-card-pricing__price">
<span>£16,500</span>
</div>
</div>
</section>
非工作 HTML(行索引 2):
<section class="product-card-pricing">
<div class="product-card-pricing__content">
<div class="product-card-pricing__price">
<span>£12,995</span>
</div>
</div>
</section>
元素选择器:
data['Price'] = listing.find_elements_by_css_selector('section.product-card-pricing')[0].text
输出看起来像这样(根据相应的示例注意行 ID 1 和 2)
解决方案
您的问题与该站点显示 Cookie 权限对话框的事实有关,该对话框添加了一个 html 类,以防止页面滚动将 css 溢出设置为隐藏。
也就是说,selenium 尝试滚动到视口下方的第 n 个元素,但不能,也无法检索任何内容。
只需添加这些导入
from selenium.webdriver.support.wait import WebDriverWait
import selenium.webdriver.support.expected_conditions as EC
from selenium.webdriver.common.by import By
和这些行(第一行和最后一行是您现有代码中的行)
driver.get('https://www.autotrader.co.uk/car-search?sort=relevance&postcode=se83gt&radius=1500&make=LAND%20ROVER&model=RANGE%20ROVER%20EVOQUE&include-delivery-option=on&seller-type=private&page=' + str(current_page))
# ADD FROM HERE -----------
html = WebDriverWait(driver, 10).until(
EC.visibility_of_element_located(
(By.CSS_SELECTOR, "html.sp-message-open")
)
)
driver.execute_script(
"arguments[0].setAttribute('class',arguments[1])",
html,
''
)
# TO HERE -----------
listings = driver.find_elements_by_css_selector('li.search-page__result')
上面的代码将产生以下输出:
DevTools listening on ws://127.0.0.1:64924/devtools/browser/6d3a45f2-6cbe-47af-8d92-5e52dabb4ad7
Title Price ... Attention Grabber URL
0 Land Rover Range Rover Evoque 2.2 ED4 Pure Tec... £10,500 ... NaN NaN
1 Land Rover Range Rover Evoque 2.2 TD4 Pure AWD... £12,995 ... NaN NaN
2 Land Rover Range Rover Evoque 2.2 SD4 Pure Tec... £10,495 ... NaN NaN
3 Land Rover Range Rover Evoque 2.2 SD4 Dynamic ... £16,850 ... NaN NaN
4 Land Rover Range Rover Evoque 2.2 SD4 Dynamic ... £11,999 ... NaN NaN
5 Land Rover Range Rover Evoque 2.0 eD4 SE Tech ... £18,950 ... NaN NaN
6 Land Rover Range Rover Evoque 2.2 ED4 Pure 2WD... £12,000 ... NaN NaN
7 Land Rover Range Rover Evoque 2.2 SD4 Pure Tec... £13,620 ... NaN NaN
8 Land Rover Range Rover Evoque 2.0 TD4 HSE Dyna... £17,900 ... NaN NaN
9 Land Rover Range Rover Evoque 2.0 eD4 SE (s/s)... £18,000 ... NaN NaN
推荐阅读
- shopify - 产品详细信息页面上的需要按钮 shopify 应用程序开发
- java - Tomcat7 管理器中的空会话
- encryption - Desfire EV1 通信 - 如何分配 IV
- javascript - 具有多个条件javascript的数组过滤
- qt - 如何在两个 ListView 之间共享 ItemSelectionModel
- .htaccess - .htaccess 在一次 301 重定向中将所有“+”转换为“-”
- asp.net - 如何正确地将目标框架更改为 .NET 4.0
- ios - 未找到架构 x86_64 的 MDF 国际化框架
- php - explode() 期望参数 2 是字符串,给定数组
- c - 寄存器如何作为汇编中的参数工作?