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
相关产品推荐
相关产品推荐

