使用Beautiful Soup [Python] 从表格中提取文本

13 投票
3 回答
34023 浏览
提问于 2025-04-16 08:23

我刚接触Python,也刚开始学习Beautiful Soup!我听说这个工具很棒,可以用来解析和提取内容。所以我来这里了……

我想获取一个HTML文档中表格的第一个里的内容。例如,我有这个表格:

<table class="bp_ergebnis_tab_info">
    <tr>
            <td>
                     This is a sample text
            </td>

            <td>
                     This is the second sample text
            </td>
    </tr>
</table>

我该如何使用Beautiful Soup来获取文本"This is a sample text"呢?我用soup.findAll('table', attrs={'class':'bp_ergebnis_tab_info'})来获取整个表格。

谢谢……或者我应该尝试用Perl来获取所有内容……不过我对Perl不太熟悉。另一种解决方案是用PHP的正则表达式。

请查看目标链接:[1]: http://www.schulministerium.nrw.de/BP/SchuleSuchen?action=799.601437941842&SchulAdresseMapDO=142323

注意:由于HTML有点不规范——我觉得我们需要做一些清理。这可能会导致很多PHP代码,因为我们想用PHP来解决这个问题。Perl也是一个不错的选择。

非常感谢一些提示和想法,帮助我找到一个起点。

3 个回答

1

我觉得Beautiful Soup是个非常好用的工具,所以我一直在学习它 :-) 它可以解析那些标记不规范的网页,所以应该能处理你提到的页面。如果你想要得到一个格式正确的网页源代码,可以使用命令 BeautifulSoup(html).prettify()

至于你的问题,你第一次使用的 soup.findAll(...) 命令的结果也是一个Beautiful Soup对象,你可以在这个对象里进行第二次搜索,像这样:

table_soup = soup.findAll('table' ,attrs={'class':'bp_ergebnis_tab_info'})
your_sample_text = table_soup.find("td").renderContents().strip()

print your_sample_text
10

使用 "text" 来获取 "td" 之间的文本

1) 首先,通过标签或ID来读取表格的DOM结构

soup = BeautifulSoup(self.driver.page_source, "html.parser")
htnm_migration_table = soup.find("table", {'id':'htnm_migration_table'})

2) 读取tbody部分

tbody = htnm_migration_table.find('tbody')

3) 从tbody标签中读取所有的tr

trs = tbody.find_all('tr')

4) 使用tr来获取所有的td

for tr in trs:
      tds = tr.find_all('td')
      for td in tds:
      print(td.text)
18

首先,找到那个表格(就像你正在做的)。使用 find 而不是 findall,这样会返回列表中的第一个项目(而不是返回所有找到的项目的列表——在那种情况下,我们还得加一个 [0] 来取出列表中的第一个元素):

table = soup.find('table' ,attrs={'class':'bp_ergebnis_tab_info'})

接着,再次使用 find 来找到第一个 td

first_td = table.find('td')

然后使用 renderContents() 来提取文本内容:

text = first_td.renderContents()

... 这样就完成了工作(不过你可能还想用 strip() 来去掉前后的空格):

trimmed_text = text.strip()

这应该会得到:

>>> print trimmed_text
This is a sample text
>>>

如你所愿。

撰写回答