【日期选择】千瓜笔记日期选择失效问题
评论
收藏

【日期选择】千瓜笔记日期选择失效问题

经验分享
郑华炳
2026-09-12 20:19·浏览量:152
郑华炳
影刀高级开发者
发布于 2026-09-12 20:19152浏览

一、问题场景

我们每天都需要在千瓜数据网站抓取和品牌相关的各个博主的笔记内容,需要选定当日或者指定日期的笔记

把这些博主的笔记内容按照这个日期的笔记内容全部抓取下来推送给到相关人员

二、遇到的问题

千瓜数据网站一直都有快捷选择日期的功能,其实也挺方便的

但是呢,它时不时的改版了,没有了当日和三天内的日期选择的快捷时间

导致我有两个程序在运行过程无法使用点击功能功能选择快捷时间导致程序停止

就是下面这个快捷选择时间

三、解决方案

后来看到魔法指令升级了,我就试了试,特别好使

我就用自然语言描述了我的日期需求,发给魔法指令,它就生成了我需要的日期选择需求

解决步骤就是魔法指令-输入需求-生成代码-在日期面板自动根据我输入的日期选择日期

指令功能:

在 ElementUI 风格的日期范围选择器中,自动计算并选择最近三天的日期范围。

实现流程:

1. 计算日期:利用 Python 的 datetime 库获取当前系统时间,并计算出 3 天前的日期作为开始日期。

2. 展开面板:点击 日期控件 触发弹出 多日期选择器面板。

3. 初始化作用域:根据黄金法则,获取 多日期选择器面板 的 WebElement 对象,后续所有内部元素查找均基于此对象。

4. 导航至开始月份:通过解析面板 Header 的年月文本,循环点击年/月切换按钮,直到开始日期所在的月份出现在视图中。

5. 点击开始日期:在对应的面板侧(左或右)使用精确的相对 XPath 定位并点击目标日期。

6. 导航至结束月份:同理,确保结束日期所在的月份出现在视图中。

7. 点击结束日期:定位并点击结束日期,完成范围选择。

from datetime import datetime, timedelta
import re
from typing import List, Dict, Optional, Any

from typing import *
try:
    from xbot.app.logging import trace as print
except:
    from xbot import print

from xbot_ai import *

def select_recent_three_days(web_page, date_input, date_panel) -> None:
    """
    title: 在日期控件中选择最近三天范围
    description: 点击%date_input%展开%date_panel%,自动计算并选择从前天到今天的3天日期范围。
    inputs: 
        - web_page (WebPage): 目标网页
        - date_input (Selector): `日期控件`,uuid: sp1aj9fa
        - date_panel (Selector): `多日期选择器面板`,uuid: sp217t8e
    outputs: 
        - None
    """

    # 1. 计算目标日期范围(最近3天:前天、昨天、今天)
    end_date = datetime.now()
    start_date = end_date - timedelta(days=2)
    
    print(f"1. 目标日期范围: {start_date.strftime('%Y-%m-%d')} 至 {end_date.strftime('%Y-%m-%d')}")

    # 2. 点击日期控件并获取面板根对象
    print("2. 点击日期控件展开面板")
    date_input_elem = web_page.wait_for_element(date_input)
    date_input_elem.click(delay_after=0.5)
    
    # 获取面板根对象(黄金法则:多作用域绝对约束,后续所有操作均基于此对象)
    panel_elem = web_page.wait_for_element(date_panel)

    def _parse_year_month(text: str):
        """从 '2026 年 7 月' 字符串中提取数字"""
        nums = re.findall(r'\d+', text)
        if len(nums) < 2:
            raise ValueError(f"无法从文本 '{text}' 中解析年月")
        return int(nums[0]), int(nums[1])

    def _get_current_view():
        """获取当前左右面板显示的年月"""
        left_header = panel_elem.wait_for_element(".//div[contains(@class, 'is-left')]//div[@class='el-date-range-picker__header']/div")
        right_header = panel_elem.wait_for_element(".//div[contains(@class, 'is-right')]//div[@class='el-date-range-picker__header']/div")
        l_y, l_m = _parse_year_month(left_header.get_text())
        r_y, r_m = _parse_year_month(right_header.get_text())
        return (l_y, l_m), (r_y, r_m)

    def _navigate_to_target(target_year: int, target_month: int):
        """切换面板使目标年月出现在视图中(左侧或右侧)"""
        for _ in range(24): # 最多尝试24次点击,防止死循环
            (l_y, l_m), (r_y, r_m) = _get_current_view()
            
            # 如果目标年月已经在左侧或右侧显示,则停止切换
            if (target_year == l_y and target_month == l_m) or (target_year == r_y and target_month == r_m):
                break
            
            # 确定点击哪个按钮进行导航
            # 目标在当前视图之前:操作左侧面板的“上”按钮
            if target_year < l_y:
                btn_xpath = ".//div[contains(@class, 'is-left')]//button[contains(@class, 'el-icon-d-arrow-left')]"
            elif target_year == l_y and target_month < l_m:
                btn_xpath = ".//div[contains(@class, 'is-left')]//button[contains(@class, 'el-icon-arrow-left')]"
            # 目标在当前视图之后:操作右侧面板的“下”按钮
            elif target_year > r_y:
                btn_xpath = ".//div[contains(@class, 'is-right')]//button[contains(@class, 'el-icon-d-arrow-right')]"
            else: # target_year == r_y and target_month > r_m
                btn_xpath = ".//div[contains(@class, 'is-right')]//button[contains(@class, 'el-icon-arrow-right')]"
            
            nav_btn = panel_elem.wait_for_element(btn_xpath)
            nav_btn.click(delay_after=0.3)
        else:
            raise RuntimeError(f"无法切换到目标日期: {target_year}-{target_month}")

    def _click_day(target_day: int, target_year: int, target_month: int):
        """在正确的面板侧点击具体日期"""
        (l_y, l_m), (r_y, r_m) = _get_current_view()
        
        if target_year == l_y and target_month == l_m:
            side_class = "is-left"
        elif target_year == r_y and target_month == r_m:
            side_class = "is-right"
        else:
            raise RuntimeError(f"目标年月 {target_year}-{target_month} 不在当前视图中")

        # 优化后的 XPath:在对应侧的表格中,寻找不属于相邻月份(prev/next)的 td 节点下的 span
        # 使用 normalize-space 处理可能的空格,确保匹配准确
        day_xpath = (
            f".//div[contains(@class, '{side_class}')]//table[@class='el-date-table']"
            f"//td[not(contains(@class, 'prev-month')) and not(contains(@class, 'next-month'))]"
            f"//span[normalize-space(text())='{target_day}']"
        )
        
        day_elem = panel_elem.wait_for_element(day_xpath)
        day_elem.click(delay_after=0.5)

    # 3. 选择开始日期
    print(f"3. 正在选择开始日期: {start_date.year}年{start_date.month}月{start_date.day}日")
    _navigate_to_target(start_date.year, start_date.month)
    _click_day(start_date.day, start_date.year, start_date.month)

    # 4. 选择结束日期
    print(f"4. 正在选择结束日期: {end_date.year}年{end_date.month}月{end_date.day}日")
    _navigate_to_target(end_date.year, end_date.month)
    _click_day(end_date.day, end_date.year, end_date.month)

    print("5. 成功完成日期范围选择")

四、最终效果

现在日期的选择每次都可以成功

现在是不管我想选择1天、2天、3天还是业务需求的任务日期都能满足

而且是可以快速切换需求日期的魔法指令日期,牛逼

现在已经没有碰到日期出错的情况。

五、踩坑提醒

自定义日期虽然很多时候很方便的

但是一旦网页改版少了某一个快捷日期

比如我之前想要的3天,就没有了,不能满足需求

所有还是少选择自定义日期

使用魔法指令很好满足日期选择需求

收藏
全部评论(1)
最新
发布评论
评论