• Python HTML Resolution Demo


    1. SGMLParser:

      这里定义了一个Parse类,继承SGMLParser里面的方法。使用一个变量is_h4做标记判定html文件中的h4标签,如果遇到h4标签,则将标签内的内容加入到Parse的变量name中。解释一下start_h4()和end_h4()函数,他们原型是SGMLParser中的

    start_tagname(self, attrs)
    end_tagname(self)

    tagname就是标签名称,比如当遇到<h4>,就会调用start_h4,遇到</h4>,就会调用 end_h4。attrs为标签的参数,以[(attribute, value), (attribute, value), ...]的形式传回。

    Demo:

     #!/usr/bin/python2.7
     # FileName: sgmlparser.py
     # Author: lxw
     # Date: 2015-07-30
         
     import urllib2
     from sgmllib import SGMLParser
             
     class Parse(SGMLParser):
         def __init__(self):
             SGMLParser.__init__(self)
             self.is_h4 = ""
             self.name = []
             self.is_a = ""
             self.link = []
             
         def start_h4(self, attrs):
             self.is_h4 = 1
             
         def end_h4(self):
             self.is_h4 = ""                                                           
             
         def start_a(self, attrs):
             self.is_a = 1
             
         def end_a(self):
             self.is_a = ""
                 
         def handle_data(self, text):
             if self.is_h4 == 1:
                 self.name.append(text)
             if self.is_a == 1:
                 self.link.append(text)
         
     def main():
         #content = urllib2.urlopen("https://kb.isc.org/").read()
         content = urllib2.urlopen("https://list.taobao.com/browse/cat-0.htm").read()
         parse = Parse()
         parse.feed(content)
         for item in parse.link:
             print(item.decode("gbk").encode("utf-8"))
         print("-"*20)
         for item in parse.name:
             print(item.decode("gbk").encode("utf-8"))
     
     
     if __name__ == '__main__':
         main()
     else:
         print("Being imported as a module.")

    2. PyQuery: 

    #!/usr/bin/python2.7
     #coding=utf-8
     #如果想有中文注释就必须得有上面的语句
     # FileName: pyQueryParse.py
     # Author: lxw
     # Date: 2015-07-30
     
     from pyquery import PyQuery
     '''
     直接运行没有问题, 但当把输出重定向到文件时, 就出现如下错误:
     UnicodeEncodeError: 'ascii' codec can't encode characters in position 166-167:     ordinal not in range(128)
     解决方法是增加下面的三行代码:
     '''
     import sys 
     reload(sys)
     sys.setdefaultencoding("utf-8")
     
     def main():
         source = PyQuery(url="https://list.taobao.com/browse/cat-0.htm")
         #print(type(source))    #<class 'pyquery.pyquery.PyQuery'>
         #print(type((source("a"))))  #<class 'pyquery.pyquery.PyQuery'>
         for data in source.find("a"):
             #print(type(data))   #<class 'lxml.html.HtmlElement'>
             #print(type(PyQuery((data))))   #<class 'pyquery.pyquery.PyQuery'>
             #print(type(PyQuery(data).text())) #<type 'unicode'>/<type 'str'>
             print(PyQuery(data).text())                                               
     
     if __name__ == '__main__':
         main()
     else:
         print("Being imported as a module.")

    References:

    Python写爬虫——抓取网页并解析HTML

    python数据抓取之pyquery包

  • 相关阅读:
    2.5亿!华为成立新公司!
    两年半换第 4 份工作,做个总结
    不懂什么叫编程?
    Google 为什么把几十亿行代码放在一个库?
    IntelliJ 平台 2020 年路线图
    别找了,这是 Pandas 最详细教程了
    MongoDB是什么?看完你就知道了!
    有了这个神器,轻松用 Python 写 APP !
    整理出来几个比较实用的代码对比工具
    学习进度条 第六十一-七十五天 SpringMVC学习笔记
  • 原文地址:https://www.cnblogs.com/lxw0109/p/sgmllib_sgmlparser.html
Copyright © 2020-2023  润新知