針對淘寶店鋪頁面,使用 driver.find_element_by_xpath(...).text.strip() 提取店名與掌櫃名,結果全部為空。page_source 確認 HTML 結構完整,嘗試 ActionChains 滑鼠懸停觸發隱藏層仍無效。但改用 find_element_by_id 卻能正常提取,揭示問題核心在於 XPath 定位的節點結構特性。
觀察目標 HTML 片段:
<span class="shop-name">
店鋪:
<a ...>錦文圖書批發<i id="J_TEnterShop">進入店鋪</i></a>
</span>
目標文本「錦文圖書批發」位於 <a> 標籤直屬文本節點,後接巢狀 <i> 標籤。此結構屬於 混合內容模型:父元素同時包含文本節點與子元素節點。
//a/text() 僅匹配第一個文本節點 → 空(因瀏覽器 DOM 解析可能將前置空白文本節點視為首個節點)。//i/text() → 「進入店鋪」(正常)。//a 整體 .text → 「錦文圖書批發進入店鋪」(串聯所有後代文本)。結論:XPath text() 僅提取直接子文本節點,若目標文本非首個子節點或存在前置空白節點,將提取失敗。需針對「標籤封閉結構」設計提取策略。
利用 id="J_TEnterShop" 等穩定屬性定位,或尋找頁面其他包含完整店名的獨立節點(如 <title>、meta 標籤、JSON-LD 結構化資料)。
full_text = driver.find_element_by_xpath("//a").text # "錦文圖書批發進入店鋪"
suffix = driver.find_element_by_xpath("//i").text # "進入店鋪"
shop_name = full_text[:-len(suffix)] # "錦文圖書批發"
適用於「目標文本 + 固定後綴」的固定模式,邏輯簡單且穩健。
id、data-* 等語義化屬性定位,避免脆弱的絕對路徑 XPath。page_source 或開發者工具驗證 DOM 真實結構(含空白文本節點)。.text 屬性(串聯所有後代文本)配合字串處理比單純 text() 更可靠。WebDriverWait)確保目標節點已掛載。