san*_*til 3 html python 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)
Run Code Online (Sandbox Code Playgroud)
该程序读取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>
Run Code Online (Sandbox Code Playgroud)
传递上面的html之后输出是:
数据:
数据:获得的标记:
数据:75.67满分100的数据:数据:
数据:
数据:GATE得分:
数据:911
数据:数据:
数据:
数据:全印度排名:
数据:34
但解析器应该读取更大的文件,上面提到的代码只是该大文件的一小部分.该文件太大,无法在此处粘贴.所以我将其上传到以下链接:http://www.mediafire.com/?dsgr1gdjvs59c7c 当传递较大的文件时,解析器不读取所有条目,在输出中留下一些空白条目.部分输出如下所示:
数据:Syllabi
数据:
数据:GATE得分
数据:
数据:GATE结果
数据:
观察Gate Score下面的行中的空白条目,该值在之前的输出中为911.
解析器适用于小文件但不适用于大文件为什么会发生这种情况?我使用的是Python 2.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()')
Run Code Online (Sandbox Code Playgroud)
产量:
['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 ']
Run Code Online (Sandbox Code Playgroud)
此代码创建ElementTreeHTML数据.使用xpath,它选择所有<tr>具有属性的元素class="trmenu1".然后为每个<tr>选择并打印任何<td>孩子的文本.
| 归档时间: |
|
| 查看次数: |
6796 次 |
| 最近记录: |