【问题标题】:Beautiful Soup [Python] and the extracting of text in a tableBeautiful Soup [Python] 和表格中文本的提取
【发布时间】:2010-12-11 09:16:06
【问题描述】:

我是 Python 新手,也是 Beatiful Soup 的新手!我听说过BS。它被告知是解析和提取内容的好工具。所以我在这里......:

我想在 html 中获取表格的第一个 td 的内容 文档。比如我有这张表

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

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

如何使用 beautifulsoup 获取文本“这是示例文本”? 我用 soup.findAll('table' ,attrs={'class':'bp_ergebnis_tab_info'}) 得到 整张桌子。

谢谢...或者我应该尝试使用 Perl 来获取全部内容...我不太熟悉。另一个解决方案是 PHP 中的正则表达式。

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

注意;由于 html 有点无效 - 我认为我们必须进行一些清理。这会导致大量的 PHP 代码——因为我们想用 PHP 来解决这个工作。 Perl 也是一个很好的解决方案。

非常感谢您提供的一些提示和想法作为起点 零

【问题讨论】:

  • 嗯,很明显,你没有从你的 Perl 问题中得到很多,所以我什至不确定为什么这个问题被标记为 Perl。此外,不要每隔几周创建一个新帐户:创建一个并坚持下去。 @zero 知道我在说什么。其他人可以查看stackoverflow.com/users/477580/thebutcherstackoverflow.com/q/3991571/100754 以及从那里链接的问题。

标签: php python


【解决方案1】:

首先找到表(就像你正在做的那样)。使用 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
>>>

根据需要。

【讨论】:

  • 您好 psmears,非常感谢您的回答。你鼓励我用美丽的汤!你的提示非常清晰和简洁。非常感谢“学习新技术”这一伟大资产。我很开心。问候零
  • 你能用find()代替text=搜索文本内容吗?
  • 如何找到 seocnd td?
  • @TheLaggyTablet:使用findall,然后使用[1]为结果下标。
【解决方案2】:

使用“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 = htnm_migration_table.find('tbody')

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

trs = tbody.find_all('tr')

4) 使用 tr 获取所有 tds

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

【讨论】:

    【解决方案3】:

    我发现 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
    

    【讨论】:

    • 您好 Martin - 非常感谢您的精彩提示。我很高兴你的帖子:你鼓励我学习美丽的汤!我会做!至于代码。我会将代码应用于上述目标 URL。我回来报告我所有的发现。再次 - 非常感谢您的帮助!这对我来说是一个很好的学习资产!向您(以及整个社区)问好
    猜你喜欢
    • 2021-04-20
    • 1970-01-01
    • 1970-01-01
    • 2021-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多