我需要解析一个网页并从中提取一些值。所以我创建了一个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
答案 0 :(得分:7)
我首选的解析HTML或XML的解决方案是lxml
和xpath
。
关于如何使用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'"> <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。