使用Python中的Beautiful Soup解析HTML表

时间:2014-10-21 04:25:01

标签: python parsing web-scraping beautifulsoup

我从http://my.gwu.edu/mod/pws/courses.cfm?campId=1&termId=201501&subjId=ACCY

中提取了这个简单的HTML表格
<tr align="center" class="tableRow1Font" >
<td>OPEN</td>
<td>80002</td>
<td>
<span style="font-weight:bold;">
ACCY
</span> 
<A HREF="http://bulletin.gwu.edu/search/?P=ACCY+2001" target="_blank">
<span style="font-weight:bold;">
2001
</span>
</A>
</td>

<td>10</td>
<td>Intro Financial Accounting</td>
<td>3.00</td>
<td> Ray, K</td>
<td><a href="http://virtualtour.gwu.edu/#MON" target="_blank" >MON</a> 113</td>
<td>MW<br>12:45PM - 02:00PM</td>
<td>08/25/14 - 12/06/14</td>
<td>

</td>
</tr>

我想找到所有tr align =&#34;中心标签,然后去掉其中的td值。我希望我的代码输出看起来像这样(每行td值用一行逗号分隔):

OPEN, 80002, ACCY 2001, 10, Intro to Financial Accounting, 3.00, Ray, K, MW 12:45-02:00

我的代码:

import bs4
import requests 

response = requests.get('http://my.gwu.edu/mod/pws/courses.cfm?campId=1&termId=201501&subjId=ACCY')

soup = bs4.BeautifulSoup(response.text)

for tr in soup.findAll('tr align="center"'):
    stack = []
    for td in tr.findAll('td'):
    stack.append(td.text.strip())

print(",".join(stack))

这不起作用。我怎样才能抓住这个&#39; td&#39;仅来自&#39; tr align = center&#39;标签

2 个答案:

答案 0 :(得分:2)

为了从给定的html代码中检索表格,最好使用"class=tableRow1Font"属性。

代码可以写成像

这样的东西
for tr in soup.findAll('tr', class_="tableRow1Font"):
      for td in tr.findAll('td'):

要使用align=center本身,您可以使用attr

findall参数
for tr in soup.findAll('tr', attr={'class':"tableRow1Font"}):

答案 1 :(得分:1)

快速阅读docs表明find_all的第一个参数是标记的名称(在本例中为'tr')。需要将其他属性指定为命名参数:

>>> soup.find_all('tr', align='center')
[<tr align="center" class="tableRow1Font">
<td>OPEN</td>
<td>80002</td>
<td>
<span style="font-weight:bold;">
ACCY
</span>
<a href="http://bulletin.gwu.edu/search/?P=ACCY+2001" target="_blank">
<span style="font-weight:bold;">
2001
</span>
</a>
</td>
<td>10</td>
<td>Intro Financial Accounting</td>
<td>3.00</td>
<td> Ray, K</td>
<td><a href="http://virtualtour.gwu.edu/#MON" target="_blank">MON</a> 113</td>
<td>MW<br/>12:45PM - 02:00PM</td>
<td>08/25/14 - 12/06/14</td>
<td>
</td>
</tr>]

或者,您可以使用attrs参数传入attrs的dict以匹配:

>>> soup.find_all('tr', attrs={'align': 'center'})

当python中的属性名称是无效的关键字名称时,这很有用。