使用Python的HTML解析

2024-04-26 00:04:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要分析网页并从中提取一些值。所以我创建了一个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之后,输出为:

Data :

Data : Marks Obtained:
Data : 75.67 Out of 100 Data :

Data :

Data :

Data : GATE Score:
Data : 911
Data :

Data :

Data :

Data : All India Rank:
Data : 34

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

Data : Syllabi

Data :

Data : GATE Score

Data :

Data : GATE Results

Data :

观察门下分线的空白条目,前一次输出为911。

解析器可以处理小文件,但不能处理大文件 为什么会这样?我正在使用Python2.7


Tags: 文件解析器datahtml条目trclasstd
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 Score”出现的原因。

正如您在评论中所建议的,使用对格式错误的html更为宽容的BeautifulSoup。

我分析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,它选择所有有class="trmenu1"属性的<tr>元素。然后为每个<tr>选择并打印任何<td>子级的文本。

相关问题 更多 >