使用Beautiful Soup [Python] 从表格中提取文本
我刚接触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 个回答
我觉得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
使用 "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)
首先,找到那个表格(就像你正在做的)。使用 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
>>>
如你所愿。