从URL中提取表中的行

时间:2016-09-23 17:58:58

标签: python html web-scraping beautifulsoup

我想从以下链接下载所有年份的EPS值(年度趋势下)。 http://www.bseindia.com/stock-share-price/stockreach_financials.aspx?scripcode=500180&expandable=0

我尝试使用下面的答案中提到的美丽汤。 Extracting table contents from html with python and BeautifulSoup 但是在下面的代码之后无法继续。我觉得我非常接近我的回答。任何帮助将不胜感激。

from bs4 import BeautifulSoup
import urllib2
html = urllib2.urlopen("http://www.bseindia.com/stock-share-price/stockreach_financials.aspx?scripcode=500180&expandable=0").read()
soup=BeautifulSoup(html)
table = soup.find('table',{'id' :'acr'})
#the below code wasn't working as I expected it to be
tr = table.find('tr', text='EPS')

我愿意使用任何其他语言来完成这项工作

1 个答案:

答案 0 :(得分:2)

文本位于 td 而非 tr 中,因此请使用文本获取 td ,然后调用 .parent 获取 tr

In [12]: table = soup.find('table',{'id' :'acr'})

In [13]: tr = table.find('td', text='EPS').parent

In [14]: print(tr)
<tr><td class="TTRow_left" style="padding-left: 30px;">EPS</td><td class="TTRow_right">48.80</td>
<td class="TTRow_right">42.10</td>
<td class="TTRow_right">35.50</td>
<td class="TTRow_right">28.50</td>
<td class="TTRow_right">22.10</td>
</tr>
In [15]: [td.text for td in tr.select("td + td")]
Out[15]: [u'48.80', u'42.10', u'35.50', u'28.50', u'22.10']

您将看到与网页上的内容完全匹配。

另一种方法是调用 find_next_siblings

In [17]: tds = table.find('td', text='EPS').find_next_siblings("td")

In [18]: tds
Out[19]: 
[<td class="TTRow_right">48.80</td>,
 <td class="TTRow_right">42.10</td>,
 <td class="TTRow_right">35.50</td>,
 <td class="TTRow_right">28.50</td>,
 <td class="TTRow_right">22.10</td>]
In [20]: [td.text for td in tds]
Out[20]: [u'48.80', u'42.10', u'35.50', u'28.50', u'22.10']