2010-12-11 67 views
5

我是新来的Python和美丽的汤也!我听说过BS。它被告知是解析和提取内容的好工具。所以在这里我是...:美丽的汤[Python]和表中的文字提取

我想采取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也是一个很好的解决方案。

一些提示和想法的出发点非常感谢 零

+1

很明显,你没有从你的Perl问题中得到太多东西,所以我甚至不知道为什么这个问题是用Perl标记的。此外,请勿每几周创建一个新帐户:创建一个并坚持使用它。 @zero知道我在说什么。其他人可以看看http:// stackoverflow。com/users/477580/thebutcher和http://stackoverflow.com/q/3991571/100754以及从那里链接的问题。 – 2010-12-11 13:44:20

回答

12

首先找到表(因为你是这样做)。在列表中使用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 
>>> 

达到目标。

+0

你好psmears,很多很多谢谢你的答案。你鼓励我使用美丽的汤!你的提示非常非常流利和简洁。非常感谢“Learing-a-new-technique”这一伟大资产。我很开心。 Greetings Zero – zero 2010-12-11 09:53:15

+0

你可以使用'find()'搜索文本内容而不是'text ='吗? – User 2015-10-30 04:25:11

-1

我发现美丽的汤非常有效的工具,所以要学习它:-)它能够解析页面无效的标记,因此应该能够处理您所介绍的页面。如果您想要使用有效标记获取有效的重新格式化页面源,则可能需要使用命令BeautifulSoup(html).prettify()命令。

至于你的问题,你的第一个soup.findAll(...)命令的结果也是一个美丽的汤对象,你可以进行第二次搜索中,就像这样:

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

print your_sample_text 
+0

马丁你好 - 非常感谢你的提示。我对你的发帖感到非常高兴:你鼓励我学习美丽的汤!我会做!至于代码。我会将该代码应用于上述目标网址。我回来报告我的所有发现。再次 - 非常感谢您的帮助!这对我来说是一个很好的学习资产!对你(以及整个社区)的问候 – zero 2010-12-11 09:37:53