使用Python解析HTML

时间:2012-03-22 11:11:46

标签: python html parsing html-parsing

我需要解析一个网页并从中提取一些值。所以我创建了一个python解析器,如下所示:

from HTMLParser import HTMLParser
class MyHTMLParser(HTMLParser):
    def handle_data(self, data):
        print "Data     :", data

f=open("result.html","r")
s=f.read()
parser = MyHTMLParser()
parser.feed(s)

程序读取html文件并从中打印数据。

我通过了以下result.html,这里解析器工作正常

<tr class='trmenu1'>
<td>Marks Obtained: </td><td colspan=1>75.67 Out of 100</td>
</tr>
<tr class='trmenu1'>
<td>GATE Score: </td><td colspan=1>911</td>
</tr>
<tr class='trmenu1'>
<td>All India Rank: </td><td colspan=1>34</td>
</tr>

传递上述html后输出为:

  

数据:

     

数据:获得的标记:
  数据:75.67总共100个数据:

     

数据:

     

数据:

     

数据:GATE得分:
  数据:911
  数据:

     

数据:

     

数据:

     

数据:全印度排名:
  数据:34

但解析器应该读取更大的文件,上面提到的代码只是该大文件的一小部分。该文件太大,无法在此处粘贴。所以我将其上传到以下链接:http://www.mediafire.com/?dsgr1gdjvs59c7c 传递较大的文件时,解析器不读取所有条目,在输出中留下一些空白条目。 部分输出如下所示:

  

数据:Syllabi

     

数据:

     

数据:GATE得分

     

数据:

     

数据:GATE结果

     

数据:

观察Gate Score下面的行中的空白条目,该行在上一个输出中为911。

解析器适用于小文件但不适用于大文件 为什么会这样?我使用的是Python 2.7

2 个答案:

答案 0 :(得分:7)

我首选的解析HTML或XML的解决方案是lxmlxpath

关于如何使用xpath

的快速而肮脏的示例
from lxml import etree
data = open('result.html','r').read()
doc = etree.HTML(data)

for tr in doc.xpath('//table/tr[@class="trmenu1"]'):
  print tr.xpath('./td/text()')

收率:

['Registration Number: ', ' CS 2047103']
['Name of the Candidate: ', 'PATIL SANTOSH KUMARRAO        ']
['Examination Paper: ', 'CS - Computer Science and Information Technology']
['Marks Obtained: ', '75.67 Out of 100']
['GATE Score: ', '911']
['All India Rank: ', '34']
['No of Candidates Appeared in CS: ', '156780']
['Qualifying Marks for CS: ', '\r\n\t\t\t\t\t']
['General', 'OBC ', '(Non-Creamy)', 'SC / ST / PD ']
['31.54', '28.39', '21.03 ']

此代码从HTML数据中创建ElementTree。使用xpath,它会选择属性为<tr>的所有class="trmenu1"元素。然后,对于每个<tr>,它会选择并打印任何<td>个孩子的文本。

答案 1 :(得分:2)

如果你仔细查看mediafire上的html页面,你会注意到你有两个包含“GATE Score”的文本块

 line 162: <tr><td class='qlink4' background='webimages/blkbuttona3.jpg' onMouseOut="background='webimages/blkbuttona3.jpg'" onMouseOver="background='webimages/blkbuttonb3.jpg'">&nbsp;<a class="dark2" href="gscore.php" title="GATE Score">GATE Score</a></td></tr>

 line 192: <tr class='trmenu1'><td>GATE Score: </td><td colspan=1>911</td></tr>

您遇到的问题可能是由于您尝试解析的完整html页面中的错误,这就是为什么您只能看到一个“GATE得分”事件。

正如评论中建议的那样,使用更能容忍格式错误的HTML的BeautifulSoup。