Python BeautifulSoup 解析具有特定 ID 的表格

在使用 Python Beautiful Soup 解析 HTML 时,我遇到了一个问题。我想获取一个具有特定 ID 的表格中的数据,但我总是得到一个 None 结果。以下是问题的 HTML 代码示例:

<table cellspacing="0" cellpadding="3" border="0" id="ctl00_SPWebPartManager1_g_c001c0d9_0cb8_4b0f_b75a_7cc3b6f7d790_ctl00_HistoryData1_gridHistoryData_DataGrid1" style="width:100%;border-collapse:collapse;">
    <tr class="gridHeader" valign="top">
        <td class="titleGridRegNoB" align="center" valign="top"><span dir=RTL>שווי שוק (אלפי ש"ח)</span></td>
        <td class="titleGridReg" align="center" valign="top">הון רשום למסחר</td>
        <td class="titleGridReg" align="center" valign="top">שער נמוך</td><td class="titleGridReg" align="center" valign="top">שער גבוה</td>
        <td class="titleGridReg" align="center" valign="top">שער בסיס</td>
        <td class="titleGridReg" align="center" valign="top">שער פתיחה</td><td class="titleGridReg" align="center" valign="top"><span dir="rtl">שער נעילה (באגורות)</span></td>
        <td class="titleGridReg" align="center" valign="top">שער נעילה מתואם</td><td class="titleGridReg" align="center" valign="top">תאריך</td>
    </tr>
    <tr onmouseover="this.style.backgroundColor='#FDF1D7'" onmouseout="this.style.backgroundColor='#ffffff'">

... And so on

以下是我的代码示例:

html = br.response().read()
soup = BeautifulSoup(html)

table = soup.find(lambda tag: tag.name=='table' and tag.has_key('id') and tag['id']=="ctl00_SPWebPartManager1_g_c001c0d9_0cb8_4b0f_b75a_7cc3b6f7d790_ctl00_HistoryData1_gridHistoryData_DataGrid1")
rows = table.findAll(lambda tag: tag.name=='tr')

In [100]: print table
None
  1. 解决方案

根据问题的分析,有两种不同的解决方案:

解决方案 1:

仔细检查代码后,发现问题出在 find() 方法的语法上。find() 方法的第一个参数应该是一个字符串,指定要查找的标签名称。在你的代码中,你使用了 lambda 表达式来指定标签名称,这可能导致问题。因此,你可以将 lambda 表达式替换为一个字符串,如下所示:

table = soup.find('table', id="ctl00_SPWebPartManager1_g_c001c0d9_0cb8_4b0f_b75a_7cc3b6f7d790_ctl00_HistoryData1_gridHistoryData_DataGrid1")

解决方案 2:

另一个问题可能是 HTML 代码的编码方式。如果 HTML 代码不是 UTF-8 编码的,你可能会遇到解析问题。因此,你可以尝试将 HTML 代码解码为 UTF-8,然后再解析,如下所示:

html = br.response().read().decode('utf-8')
soup = BeautifulSoup(html)

table = soup.find('table', id="ctl00_SPWebPartManager1_g_c001c0d9_0cb8_4b0f_b75a_7cc3b6f7d790_ctl00_HistoryData1_gridHistoryData_DataGrid1")

代码示例:

# coding=utf-8
from bs4 import BeautifulSoup

html = u"""
<table cellspacing="0" cellpadding="3" border="0" id="ctl00_SPWebPartManager1_g_c001c0d9_0cb8_4b0f_b75a_7cc3b6f7d790_ctl00_HistoryData1_gridHistoryData_DataGrid1" style="width:100%;border-collapse:collapse;">
                            <tr class="gridHeader" valign="top">
                                <td class="titleGridRegNoB" align="center" valign="top"><span dir=RTL>שווי שוק (אלפי ש"ח)</span></td><td class="titleGridReg" align="center" valign="top">הון רשום למסחר</td><td class="titleGridReg" align="center" valign="top">שער נמוך</td><td class="titleGridReg" align="center" valign="top">שער גבוה</td><td class="titleGridReg" align="center" valign="top">שער בסיס</td><td class="titleGridReg" align="center" valign="top">שער פתיחה</td><td class="titleGridReg" align="center" valign="top"><span dir="rtl">שער נעילה (באגורות)</span>
</td><td class="titleGridReg" align="center" valign="top">שער נעילה מתואם</td><td class="titleGridReg" align="center" valign="top">תאריך</td>
                            </tr><tr onmouseover="this.style.backgroundColor='#FDF1D7'" onmouseout="this.style.backgroundColor='#ffffff'">
"""

soup = BeautifulSoup(html)
print soup.find_all("table",
                    id="ctl00_SPWebPartManager1_g_c001c0d9_0cb8_4b0f_b75a_7cc3b6f7d790_ctl00_HistoryData1_gridHistoryData_DataGrid1")

我希望这些解决方案能够帮助你解决问题。

### Gradle 配置完成后如何消除 Deprecated API 和 Unchecked 操作警告 当在 Android 开发过程中遇到 `Deprecated API` 或者 `Unchecked Operation` 的警告时,可以通过调整 Gradle 配置来处理这些问题。以下是具体的解决方案: #### 一、通过 AAPT Options 屏蔽特定警告 如果某些警告无法被屏蔽,则可以在 `build.gradle (app)` 文件中的 `android {}` 块内添加如下两行代码[^1]: ```groovy aaptOptions { cruncherEnabled = false useNewCruncher = false } ``` 这会禁用资源压缩器的新实现方式,从而可能减少部分与资源相关的警告。 --- #### 二、启用 `-Xlint` 编译参数以显示更多细节 为了更清楚地定位哪些地方存在过时的 API 或未检查的操作,可以向项目的 `gradle.build` 中添加以下配置[^2][^3]: ```groovy allprojects { gradle.projectsEvaluated { tasks.withType(JavaCompile) { options.compilerArgs << "-Xlint:unchecked" options.compilerArgs << "-Xlint:deprecation" } } } ``` 这段代码的作用是,在编译期间开启 Java 编译器的额外检查功能,具体含义如下: - **`-Xlint:unchecked`**: 提醒开发者注意泛型中可能出现的未经检查转换的情况。 - **`-Xlint:deprecation`**: 显示任何使用了已废弃方法或类的位置。 --- #### 三、针对 Deprecation Warning 进行修复 一旦启用了上述选项并重新构建项目后,可能会看到详细的警告信息指出哪一部分代码存在问题。此时应逐一排查这些位置,并考虑替换为推荐使用的替代方案[^4]。例如: - 如果某个库的方法已被标记为 @Deprecated ,查阅官方文档寻找新的接口定义; - 对于内部逻辑设计不当引发的 unchecked warning, 则需改进数据结构声明方式(比如显式指定类型参数而非 raw type)。 --- #### 四、完全忽略警告(不建议) 如果不希望频繁受到此类提醒干扰开发流程,也可以选择彻底关闭它们。不过这种做法通常只适用于非常特殊的情况下才采用。要全局抑制所有 lint 类别的消息输出,请尝试下面这种方法: ```groovy android { ... defaultConfig { javaCompileOptions.annotationProcessorOptions.arguments += ["ignoreWarnings": "true"] } } ``` 需要注意的是,这样做虽然可以让界面看起来干净许多,但实际上隐藏了一些潜在风险点,因此并不提倡作为长期策略实施下去。 --- ### 示例代码片段总结 最终完整的 `build.gradle(app)` 可能类似于这样: ```groovy android { ... aaptOptions { cruncherEnabled = false useNewCruncher = false } } allprojects { gradle.projectsEvaluated { tasks.withType(JavaCompile) { options.compilerArgs << "-Xlint:unchecked" options.compilerArgs << "-Xlint:deprecation" } } } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值