You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

XPath表达式无效错误排查:Selenium爬取谷歌搜索首链问题

问题:Selenium爬取谷歌搜索结果首个链接时XPath报错

我尝试使用Selenium爬取谷歌搜索结果中的首个链接,Python代码如下:

from selenium import webdriver
from scrapy import Selector

PATH = "C:\Program Files (x86)\chromedriver.exe"
driver = webdriver.Chrome(PATH)

start_url = "https://www.google.com/search?q=Iwtglobal+linkedin"

def parse(link):
    driver.get(link)
    page_source = driver.page_source
    selector = Selector(text=page_source)
    link = selector.xpath('//div(contains[@class="MjjYud"])').extract()
    print(link)

运行代码时出现如下错误:

File "src\lxml\etree.pyx", line 1599, in lxml.etree._Element.xpath
File "src\lxml\xpath.pxi", line 305, in lxml.etree.XPathElementEvaluator.__call__
File "src\lxml\xpath.pxi", line 225, in lxml.etree._XPathEvaluatorBase._handle_result
ValueError: XPath error: Invalid expression in //div(contains[@class="MjjYud"]

解答

1. XPath表达式语法错误

你写的//div(contains[@class="MjjYud"])存在两处语法错误:

  • XPath中筛选元素的条件必须用**方括号[]**包裹,而非圆括号
  • contains是XPath函数,正确语法为contains(@属性名, "属性值"),参数需放在圆括号内

修正后的XPath应为://div[contains(@class, "MjjYud")]

2. 未定位到目标链接

原代码仅匹配了div元素,而你需要的是链接地址,需进一步定位到div内的a标签,提取其href属性,示例XPath:

//div[contains(@class, "MjjYud")]//a/@href

3. 文件路径转义问题

Windows路径中的反斜杠会被识别为转义字符,需用原始字符串或转义后的路径:

# 原始字符串写法
PATH = r"C:\Program Files (x86)\chromedriver.exe"
# 转义写法
PATH = "C:\\Program Files (x86)\\chromedriver.exe"

4. 未调用解析函数

原代码定义了parse函数但未执行,需在代码末尾添加parse(start_url)触发爬取逻辑。

5. 谷歌搜索链接前缀处理

谷歌搜索结果的href会带有/url?q=前缀,需要提取出真实的链接地址。


修改后的完整代码

from selenium import webdriver
from scrapy import Selector

# 用原始字符串避免路径转义问题
PATH = r"C:\Program Files (x86)\chromedriver.exe"
driver = webdriver.Chrome(PATH)

start_url = "https://www.google.com/search?q=Iwtglobal+linkedin"

def parse(link):
    driver.get(link)
    page_source = driver.page_source
    selector = Selector(text=page_source)
    # 定位到搜索结果的链接href属性
    link_list = selector.xpath('//div[contains(@class, "MjjYud")]//a/@href').extract()
    
    if link_list:
        first_link = link_list[0]
        # 处理谷歌的链接前缀,提取真实地址
        if first_link.startswith('/url?q='):
            first_link = first_link.split('/url?q=')[1].split('&')[0]
        print("首个搜索结果链接:", first_link)
    else:
        print("未找到有效搜索结果链接")

# 调用解析函数
parse(start_url)

# 爬取完成后关闭浏览器
driver.quit()

内容的提问来源于stack exchange,提问作者Andrey Pushkin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 15:45:39