首页 > 解决方案 > 使用 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)

标签: pythonhtmlpython-3.xbeautifulsoup

解决方案


初始 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

推荐阅读