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

Python机器人输出错误值排查:希腊字符匹配问题求助

问题排查:希腊字符匹配导致Python爬虫逻辑失效

问题背景

开发了一款Python爬虫,用于查询指定网站的编号状态,预设逻辑如下:

  • 页面存在希腊语文本Δε βρέθηκαν αποτελέσματα时,控制台输出no,Excel对应单元格写入X
  • 页面存在希腊语文本Έχετε υπερβεί το μέγιστο αριθμό αναζητήσεων ΑΦΜ για σήμερα.时,控制台输出spam
  • 其他情况输出yes,Excel写入ΕΝΕΡΓΟ

测试时发现,无论页面是否包含目标关键词,爬虫始终输出yes,怀疑是希腊字符匹配环节出现问题。

问题分析

导致匹配失效的核心原因有三点:

  1. XPath表达式局限性:原代码使用contains(text(), "目标文本"),text()仅匹配节点的直接文本内容,若目标文本被拆分到多个子节点中(比如被<span>等标签分割),则无法匹配成功。
  2. 编码不一致:requests.get返回的响应文本可能存在编码识别错误,导致希腊字符出现隐形差异或乱码,无法与代码中的字符串匹配。
  3. 请求标识缺失:无浏览器标识的请求可能被网站拦截或返回简化内容,导致爬取的页面与浏览器实际显示不一致。

解决方案

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 00:55:20