Selenium爬取Airbnb触发InvalidSelectorException报错求助
解决Selenium爬取Airbnb房源时的InvalidSelectorException错误
问题根源
- By.CLASS_NAME不支持多类名:你传入的
'c4mnd7m dir dir-ltr'是多个类名组合,但By.CLASS_NAME仅接受单个类名,空格会被解析为选择器的一部分,直接触发非法选择器错误。 - 错误的类名前缀:子元素查找时添加了
.前缀(如.ln2bl2p dir dir-ltr),By.CLASS_NAME不需要加.,这也是导致选择器无效的原因。
修正后的代码
改用By.CSS_SELECTOR处理多类名场景,同时修正类名格式问题:
def getListings(): # 用CSS选择器匹配多类名的房源容器 listings = browser.find_elements(By.CSS_SELECTOR, 'div.c4mnd7m.dir.dir-ltr') for listing in listings: # 匹配房源链接元素 link_elem = listing.find_element(By.CSS_SELECTOR, 'a.ln2bl2p.dir.dir-ltr') link = link_elem.get_attribute('href') # 匹配价格元素 price = listing.find_element(By.CSS_SELECTOR, 'span.a8jt5op.dir.dir-ltr').text print(link, price)
额外优化建议
- 处理动态加载:Airbnb房源是动态渲染的,建议加入等待逻辑避免元素未加载完成的问题:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC def getListings(): # 等待房源容器加载完成,最长等待10秒 WebDriverWait(browser, 10).until( EC.presence_of_all_elements_located((By.CSS_SELECTOR, 'div.c4mnd7m.dir.dir-ltr')) ) listings = browser.find_elements(By.CSS_SELECTOR, 'div.c4mnd7m.dir.dir-ltr') for listing in listings: try: link_elem = listing.find_element(By.CSS_SELECTOR, 'a.ln2bl2p.dir.dir-ltr') link = link_elem.get_attribute('href') price = listing.find_element(By.CSS_SELECTOR, 'span.a8jt5op.dir.dir-ltr').text print(link, price) except Exception: # 跳过加载异常的房源 continue
- 选择器稳定性:Airbnb的类名是动态生成的,后续可能失效,建议改用更稳定的选择逻辑,比如通过元素属性(如
[href*="/rooms/"]匹配房源链接)或层级关系定位。
内容的提问来源于stack exchange,提问作者Cat Hat
相关产品推荐
相关产品推荐

