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处理嵌套表格的问题
核心思路: 处理嵌套表格的关键在于逐层定位,先找到外层表格,再在对应的单元格内查找内层表格。
代码示例:
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’

