python - 使用 bs4 从 td colspan 标签中提取 td 文本
问题描述
我的目标是从 colspan 下方的“td”标签中提取所有内容。我刚刚开始使用bs4。到目前为止,我可以从页面中提取所有“trs”,但是,我只想要名为 Disks 的 info_row 类下的信息。非常感谢任何有关逻辑和/或代码的帮助。
这是 HTML 的摘录
<tbody>
<tr>
<td colspan="100%" class="info_row">Disks</td>
</tr>
<tr>
<td> sda </td>
<td> 123456 </td>
<td> abcdefg </td>
</tr>
<tr>
<td> sdb </td>
<td> 123456 </td>
<td> abcdefg </td>
</tr>
</tbody>
期望的输出:
sda 123456 abcdefg
sbd 123456 abcdefg
到目前为止,我有以下内容:
src = open("my_page.html").read()
soup = BeautifulSoup(src, "html.parser")
tbody = soup.findAll("tbody")
for tr in tbody:
tds = tr.findAll('td')
for td in tds:
print(td.text)
解决方案
初始 for 循环为您找到 tr 标签的索引,其中 td 标签class="info_row"
和 text as Disks
,使用该索引您可以找到下一个 tr 标签的索引,您要提取其文本并将其用作应用get_text()
方法的列表索引提取标签内的文本:
from bs4 import BeautifulSoup
src = '''<tbody>
<tr>
<td colspan="100%" class="info_row">Disks</td>
</tr>
<tr>
<td> sda </td>
<td> 123456 </td>
<td> abcdefg </td>
</tr>
<tr>
<td> sdb </td>
<td> 123456 </td>
<td> abcdefg </td>
</tr>
</tbody>'''
soup = BeautifulSoup(src, "html.parser")
trs = soup.findAll("tr")
for i in range(len(trs)):
if trs[i].td:
if 'class' in trs[i].td.attrs and trs[i].td.text == 'Disks':
if "info_row" in trs[i].td.attrs['class']:
idx = i
break
print(' '.join(trs[idx+1].get_text(' ').split()))
print(' '.join(trs[idx+2].get_text(' ').split()))
输出
sda 123456 abcdefg
sdb 123456 abcdefg
要获取标签内的单个元素,您可以使用此代码,因为trs[idx+1].get_text(' ').split()
它实际上是一个列表:
for item in trs[idx+1].get_text(' ').split():
print(item)
for item in trs[idx+2].get_text(' ').split():
print(item)
输出
sda
123456
abcdefg
sdb
123456
abcdefg
推荐阅读
- python - 更改用户密码和用户名后用户未保持登录状态
- tomcat - 带有 Buildpack/Paketo 的 Jakarta EE 应用程序的路径是什么?
- android - 使用服务时从最近的任务中删除应用程序不会被杀死
- c++ - GCC 优化忽略循环条件
- android - Flutter PlayStore Distribution APK 无法正常工作,无法加载,卡在启动画面
- javascript - 为什么这个异步函数不返回任何东西?
- java - Netbeans 8.2 在 Mac 上崩溃
- .net-core - Blazor 组件有 CS0103 移动或复制时的名称
- html - 如何将 SVG 作为内容添加到 ::after 伪元素并对其进行缩放?
- html - Bootstrap Toggler 阻止 Accordion Toggler?