Python中如何使用BeautifulSoup处理嵌套表格的问题

今天在测试爬表格, 忽然发现有些表格中有嵌套表格的形式。。。。 没使用 xpath,主要是因为路径节点的名称会变化,而不是永久固定的,不好把握,但表格就一直相对固定的。。。

是这样的,我已经取得目标区域表格的代码, 目标区域表格嵌套的,表格中有表格?(有 td 标签)

#执行
targettable = soup.select('tr > td')

print (targettable[0]) #targettable 有好多个(行),先把第一行的表格处理吧,

输出:

<td class="pagket">
<a class="ah" href="javascript:void(0);" id="p_109746"><code style="display:none">物件</code><i>77239</i></a>
</td>

<td class=“pagketname” title=“model16”> <a href=“http://10.11.12.1/gooddata/1733356.html” target="_blank"><span class=“2016”><s></s>蔡杰</span></a> </td>

<td class=“width”> <span id=“w_19281” title=“宽度”>349</span> <span style=“display:none” title=“录入时间:2016-03-11 12:30”>12:30</span> <span style=“display:none” title=“审核时间:2016-03-11 14:21”>14:21</span> </td>

<td class=“weight”> <span id=“wt_19281” title=“重量”>349</span> </td>

<td class=“conductor”> <em class=“pm “>处理人 <i title=“物件处理人”>陈才华</i> </em> <a href=“http://10.11.12.1/staff/41.html” target=”_blank” title=“联系人”>陈才华</a> </td>

第一个问题:在输出的第一行,是'td class'这种标签属性,应该如何从 targettable[0]中获取其内容? 我这样做是不行的,望请高手指点迷津...

print(targettable[0].find('td').attrs['class']))
print(targettable[0].find('td').attrs['td class']))

也试过这样:

for tr in soup.select('tr > td'):
targettr = BeautifulSoup(tr.text, "lxml")
#然后想对 targettr 做些什么,好像这条路做不通?

第二个问题:

<td class="pagketname" title="model16">

读出 title 内容?

第三个问题:在 targettable[0]这个里面的标签里面,有两个内容,这种再嵌套的内容,如何读出来?

<span style="display:none" title="录入时间:2016-03-11 12:30">12:30</span>
<span style="display:none" title="审核时间:2016-03-11 14:21">14:21</span>

Python中如何使用BeautifulSoup处理嵌套表格的问题

2 回复

核心思路: 处理嵌套表格的关键在于逐层定位,先找到外层表格,再在对应的单元格内查找内层表格。

代码示例:

from bs4 import BeautifulSoup

html = """
<table id="outer">
  <tr>
    <td>Cell 1</td>
    <td>
      <table id="inner">
        <tr><td>Nested Data A</td></tr>
        <tr><td>Nested Data B</td></tr>
      </table>
    </td>
  </tr>
</table>
"""

soup = BeautifulSoup(html, 'html.parser')

# 1. 定位外层表格
outer_table = soup.find('table', id='outer')

# 2. 遍历外层表格行
for row in outer_table.find_all('tr'):
    cells = row.find_all('td')
    for cell in cells:
        # 3. 检查单元格内是否存在嵌套表格
        inner_table = cell.find('table')
        if inner_table:
            print(f"找到嵌套表格,开始处理:")
            # 4. 处理内层表格数据
            for inner_row in inner_table.find_all('tr'):
                inner_data = inner_row.find('td').text
                print(f"  - 嵌套数据: {inner_data}")
        else:
            print(f"普通单元格内容: {cell.text.strip()}")

关键方法说明:

  • find():获取第一个匹配元素
  • find_all():获取所有匹配元素
  • 通过find('table')在单元格内检测嵌套表格

总结建议: 使用递归或循环逐层解析表格结构。


我自己试了一下。
text = “”“上述输出”""
soup = BeautifulSoup(text,“lxml”)

soup.find(“td”).attrs[‘class’]#这个做法应该和你的一样
Out[157]: [‘pagket’]

soup.find(“td”,{“class”,“pagketname”}).attrs[‘title’]#和第一个问题一样吧
Out[159]: 'model16’

a = soup.find_all(“span”,{“style”:“display:none”})#第三个问题

a[0].attrs[‘title’]
Out[161]: '录入时间:2016-03-11 12:30’

a[0].get_text()
Out[162]: ‘12:30’

回到顶部