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

Python Selenium税务爬取脚本本地正常,Ubuntu服务器端bills页无表格

税务数据爬取需求与运行异常问题

具体爬取需求

  • 目标页面为指定房产编号对应的布劳沃德县公开税务查询账单页
  • 执行步骤:
    1. 定位页面账单列表表格,获取表格第一行条目
    2. 点击该条目跳转至对应税单详情页
    3. 抓取*从价税(Ad Valorem Taxes)*板块下的所有征税主体(TAXING AUTHORITY)名称、对应税率(MILLAGE)数据

运行异常表现

已基于Python Selenium完成对应爬取脚本开发:

  • 脚本在本地Linux Mint 19环境可稳定运行,全流程逻辑正常
  • 脚本部署到Ubuntu服务器环境后完全失效:加载账单页面时未渲染任何表格及表格数据,打印driver.page_source源码后确认表格相关DOM元素完全缺失,请求定位问题解决方案

现有爬取函数核心源码

class TaxScraper:
    def download_tax_bill_form(self, formatted_apn):
        """
        按指定格式化后的房产编号抓取县税单表格数据
        :param formatted_apn: 格式化完成的房产编号

        返回结构化字典对象,结构示例如下:
        {
            ad_valorem_taxes: [
                {
                    'group_name': 'BROWARD COUNTY GOVERNMENT',
                    'items': [
                        {
                            'name': 'COUNTYWIDE SERVICES',
                            'millage': 5.49990
                        },
                        ...
                    ]
                },
                ...
            ]
        }
        """
        if self.driver is None:
            # 初始化Chrome驱动实例
            self.driver = self.create_driver()

        # 拼接账单页URL并跳转
        self.driver.get(f'https://broward.county-taxes.com/public/real_estate/parcels/{formatted_apn}/bills')
        self.driver.implicitly_wait(5)

        # 等待并点击账单表格第一行(对应上一年度税单条目)
        WebDriverWait(self.driver, 20).until(
            EC.element_to_be_clickable(
                (
                    By.XPATH,
                    "(//table[@class='table table-hover bills']/tbody)[1]/tr/th/a[1]"
                )
            )
        ).click()

        # 定位从价税板块下的所有表格行容器
        ad_valorem_taxes_items = self.driver.find_elements_by_xpath("//div[@class='row advalorem']/div/table/tbody")

        groups = []
        group = {}

        # 遍历表格元素转换为结构化字典
        for item in ad_valorem_taxes_items:
            class_name = item.get_attribute("class")

            if class_name == 'district-group':
                # 遇到新分组时,将上一个分组存入结果列表
                if group:
                    groups.append(group)

                group = {}

                group_name = item.find_element_by_xpath('.//tr/th').text
                group["group_name"] = group_name
                group["items"] = []

            elif class_name == 'taxing-authority':
                name = item.find_element_by_xpath(".//tr/th[@class='name']").text
                try:
                    millage = float(item.find_element_by_xpath(".//tr/td[@class='millage']").text)
                except ValueError:
                    # 税率解析失败时置空
                    millage = None

                group_item = {
                    "name": name,
                    "millage": millage
                }
                group["items"].append(group_item)

        # 追加最后一个分组数据到结果列表
        groups.append(group)
        return {"ad_valorem_taxes": groups}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.25 18:36:02