How to parse a HTML file with table using Python
I have got a html file with table ( its a l开发者_StackOverflow社区arge one, so only sample code is given ). I want to retrieve the values in tables. I tried the HTMLParser library from python.
I started coding like below. Then I found that the attribute "class" is same as system defined keyword. So its giving me error.
class MyHTMLParser(HTMLParser):
def handle_starttag(self, tag, attrs):
if tag == 'tr':
for class in attrs:
if class == 'Table_row'
p = MyHTMLParser()
p.feed(ht)
HTML code for table
<table class="Table_rows" cellspacing="0" rules="all" border="1" id="MyDataGrid" style="width:700px;border-collapse:collapse;">
<tr class="Table_Heading">
<td>STATION CODE</td><td>STATION NAME</td><td>SCHEDULED ARRIVAL</td><td>SCHEDULED DEPARTURE</td><td>ACTUAL/ EXPECTED ARRIVAL</td><td>ACTUAL/ EXPECTED DEPARTURE</td>
</tr><tr class="Table_row">
<td>TVC </td><td style="width:160px;">ORIGON</td><td>Starting Station </td><td>05:00, 07 May 2011</td><td>Starting Station</td><td>05:00, 07 May 2011</td>
</tr><tr class="alternat_table_row">
<td>TVP </td><td>NEY YORK</td><td>05:04, 07 May 2011</td><td>05:05, 07 May 2011</td><td>05:04, 07 May 2011</td><td>05:05, 07 May 2011</td>
</tr>
</table>
UPDATE
How could I get data between the tags?
Note that the documentation of the handle_starttag
method states:
The tag argument is the name of the tag converted to lower case. The attrs argument is a list of (name, value) pairs containing the attributes found inside the tag’s <> brackets.
So, you're probably looking for something like:
from HTMLParser import HTMLParser
class MyHTMLParser(HTMLParser):
def handle_starttag(self, tag, attrs):
if tag == 'tr':
for name, value in attrs:
if name == 'class':
print 'Found class', value
p = MyHTMLParser()
p.feed(ht)
Prints:
Found class Table_Heading
Found class Table_row
Found class alternat_table_row
P.S. I also recommend BeautifulSoup for parsing HTML with Python.
How to print the values like STATION CODE STATION NAME ORIGON ...?.
You can do it like this with BeautifulSoup.
from BeautifulSoup import BeautifulSoup
html = '''\
<td>STATION CODE</td><td>STATION NAME</td><td>SCHEDULED ARRIVAL</td><td>SCHEDULED DEPARTURE</td><td>ACTUAL/ EXPECTED ARRIVAL</td><td>ACTUAL/ EXPECTED DEPARTURE</td>
</tr><tr class="Table_row">
<td>TVC </td><td style="width:160px;">ORIGON</td><td>Starting Station </td><td>05:00, 07 May 2011</td><td>Starting Station</td><td>05:00, 07 May 2011</td>
'''
soup = BeautifulSoup(html)
tag = soup.findAll('td', limit=2)
tag_O = soup.findAll('td')[7]
for i in range(len(tag)):
print tag[i].string
print tag_O.string
'''Output-->
STATION CODE
STATION NAME
ORIGON
'''
I would highly recommend using the BeautifulSoup library. It handles even broken HTML with ease.
http://www.crummy.com/software/BeautifulSoup/
精彩评论