Python机器人输出错误值排查:希腊字符匹配问题求助
问题排查:希腊字符匹配导致Python爬虫逻辑失效
问题背景
开发了一款Python爬虫,用于查询指定网站的编号状态,预设逻辑如下:
- 页面存在希腊语文本
Δε βρέθηκαν αποτελέσματα时,控制台输出no,Excel对应单元格写入X - 页面存在希腊语文本
Έχετε υπερβεί το μέγιστο αριθμό αναζητήσεων ΑΦΜ για σήμερα.时,控制台输出spam - 其他情况输出
yes,Excel写入ΕΝΕΡΓΟ
测试时发现,无论页面是否包含目标关键词,爬虫始终输出yes,怀疑是希腊字符匹配环节出现问题。
问题分析
导致匹配失效的核心原因有三点:
- XPath表达式局限性:原代码使用
contains(text(), "目标文本"),text()仅匹配节点的直接文本内容,若目标文本被拆分到多个子节点中(比如被<span>等标签分割),则无法匹配成功。 - 编码不一致:
requests.get返回的响应文本可能存在编码识别错误,导致希腊字符出现隐形差异或乱码,无法与代码中的字符串匹配。 - 请求标识缺失:无浏览器标识的请求可能被网站拦截或返回简化内容,导致爬取的页面与浏览器实际显示不一致。
解决方案
1. 优化XPath表达式
将contains(text(), ...)替换为contains(., ...), .表示当前节点及其所有子节点的文本内容,能覆盖文本被拆分的场景:
//*[contains(., "Δε βρέθηκαν αποτελέσματα")] //*[contains(., "Έχετε υπερβεί το μέγιστο αριθμό αναζητήσεων ΑΦΜ για σήμερα.")]
2. 强制响应编码为UTF-8
确保响应文本编码正确,避免希腊字符乱码:
response.encoding = 'utf-8' tree = html.fromstring(response.text)
3. 添加请求头模拟浏览器
使用requests.Session()保持会话,并添加浏览器标识,避免被网站拦截:
session = requests.Session() session.headers.update({ 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36' }) response = session.get(url)
4. 移除不必要的浏览器打开操作
webbrowser.open_new_tab与requests会话不共享,会浪费资源且可能干扰反爬策略,建议直接移除。
修改后的完整代码
import openpyxl import requests from lxml import html import time # 初始化会话并设置请求头 session = requests.Session() session.headers.update({ 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36' }) # 打开Excel文件 wb = openpyxl.load_workbook("numbers.xlsx") sheet = wb.active # 遍历行 for row in sheet.rows: number = row[0].value if not number: # 跳过空行 continue url = f"https://www.vrisko.gr/afm-etairies/{str(number)}" # 发送请求并处理编码 response = session.get(url) response.encoding = 'utf-8' # 强制UTF-8编码 tree = html.fromstring(response.text) # 使用优化后的XPath匹配文本 no_result = tree.xpath('//*[contains(., "Δε βρέθηκαν αποτελέσματα")]') spam_limit = tree.xpath('//*[contains(., "Έχετε υπερβεί το μέγιστο αριθμό αναζητήσεων ΑΦΜ για σήμερα.")]') if no_result: sheet.cell(row=row[0].row, column=row[0].column+1).value = "X" print("no") elif spam_limit: print("spam") else: sheet.cell(row=row[0].row, column=row[0].column+1).value = "ΕΝΕΡΓΟ" print("yes") time.sleep(30) wb.save("numbers.xlsx")
内容的提问来源于stack exchange,提问作者Lliakos
相关产品推荐
相关产品推荐

