设为首页 收藏本站
查看: 727|回复: 0

[经验分享] 用Python解析HTML,BeautifulSoup使用简介

[复制链接]

尚未签到

发表于 2017-5-2 11:23:21 | 显示全部楼层 |阅读模式
用Python解析HTML,BeautifulSoup使用简介
  by cnDenis, http://cndenis.iteye.com,
2012年12月12日
  Beautiful Soup,字面意思是美好的汤,是一个用于解析HTML文件的Python库。主页在 http://www.crummy.com/software/BeautifulSoup/
, 下载与安装无需啰嗦,这里就介绍一下它的使用吧。


装汤——Making the Soup
  首先要把待解析的HTML装入BeautifulSoup。BeautifulSoup可以接受文件句柄或是字符串作为输入:

from bs4 import BeautifulSoup
fp = open("index.html")
soup1 = BeautifulSoup(fp)
soup2 = BeautifulSoup("<html>data</html>")


汤料——Soup中的对象

标签(Tag)
  标签对应于HTML元素,也就是应于一对HTML标签以及括起来的内容(包括内层标签和文本),如:

soup = BeautifulSoup('<b class="boldest">Extremely bold</b>')
tag = soup.b

  soup.b就是一个标签,soup其实也可以视为是一个标签,其实整个HTML就是由一层套一层的标签组成的。

名字(Name)
  名字对应于HTML标签中的名字(也就是尖括号里的第一项)。每个标签都具有名字,标签的名字使用.name来访问,例如上例中,

tag.name == u'b'
soup.name == u'[document]'

属性(Atrriutes)
  属性对应于HTML标签中的属性部分(也就是尖括号里带等号的那些)。标签可以有许多属性,也可以没有属性。属性使用类似于字典的形式访问,用方括号加属性名,例如上例中,

tag['class'] ==  u'boldest'

  可以使用.attrs直接获得这个字典,例如,

tag.attrs == {u'class': u'boldest'}

文本(Text)
  文本对应于HTML中的文本(也就是尖括号外的部分)。文件使用.text来访问,例如上例中,

tag.text ==  u'Extremely bold'


找汤料——Soup中的查找
  解析一个HTML通常是为了找到感兴趣的部分,并提取出来。BeautifulSoup提供了find和find_all的方法进行查找。find只返回找到的第一个标签,而find_all则返回一个列表。因为查找用得很多,所以BeautifulSoup做了一些很方便的简化的使用方式:

tag.find_all("a")  #等价于 tag("a")
tag.find("a") #等价于 tag.a

  因为找不到的话,find_all返回空列表,find返回None,而不会抛出异常,所以,也不用担心
tag("a") 或 tag.a
会因为找不到而报错。限于python的语法对变量名的规定,tag.a 的形式只能是按名字查找,因为点号.后面只能接变量名,而带括号的形式
tag() 或 tag.find() 则可用于以下的各种查找方式。
  查找可以使用多种方式:字符串、列表、键-值(字典)、正则表达式、函数


  •   字符串: 字符串会匹配标签的名字,例如 tag.a 或 tag("a")

  •   列表: 可以按一个字符串列表查找,返回名字匹配任意一个字符串的标签。例如 tag("h2",
    "p")

  •   键-值: 可以用tag(key=value)的形式,来按标签的属性查找。键-值查找里有比较多的小花招,这里列几条:

    • class
      class是Python的保留字,不能当变量名用,偏偏在HTML中会有很多
      class=XXX 的情况,BeautifulSoup的解决方法是加一下划线,用 class_ 代替,如
      tag(class_=XXX)。
    • True
      当值为True时,会匹配所有带这个键的标签,如 tag(href=True)
    • text
      text做为键时表示查找按标签中的文本查找,如
      tag(text=something)


  •   正则表达式: 例如 tag(href=re.compile("elsie"))

  •   函数: 当以上方法都行不通时,函数是终极方法。写一个以单个标签为参数的函数,传入 find 或
    find_all 进行查找。如

    def fun(tag):
    return tag.has_key("class") and not tag.has_key("id")
    tag(fun) # 会返回所有带class属性但不带id属性的标签


再来一碗——按文档的结构查找
  HTML可以解析成一棵标签树,因此也可以按标签在树中的相互关系来查找。


  •   查找上层节点:find_parents() 和 find_parent()

  •   查找下一个兄弟节点:find_next_siblings() 和
    find_next_sibling()

  • 查找上一个兄弟节点:find_previous_siblings() 和
    find_previous_sibling()
  以上四个都只会查同一父节点下的兄弟


  •   查找下层节点:其实上面说的find和find_all就是干这活的

  •   查找下一个节点(无视父子兄弟关系) find_all_next() 和
    find_next()

  • 查找上一个节点(无视父子兄弟关系) find_all_previous() 和
    find_previous()
  以上的这些查找的参都和find一样,可以搭配着用。


看颜色选汤——按CSS查找
  用 .select()方法,看 http://www.crummy.com/software/BeautifulSoup/bs4/doc/#css-selectors

一些小花招


  • BeautifulSoup 可以支持多种解析器,如lxml, html5lib, html.parser.
    如:BeautifulSoup("<a></b>", "html.parser")
  具体表现可参考 http://www.crummy.com/software/BeautifulSoup/bs4/doc/#differences-between-parsers


  •   BeautifulSoup 在解析之前会先把文本转换成unicode,可以用 from_encoding
    指定编码,如:BeautifulSoup(markup, from_encoding="iso-8859-8")

  •   soup.prettify()可以输出排列得很好看的HTML文本,遇上中文的话可以指定编码使其显示正常,如
    soup.prettify("gbk")

  •   还是有编码问题,看:http://www.crummy.com/software/BeautifulSoup/bs4/doc/#unicode-dammit


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-372079-1-1.html 上篇帖子: python中可hash的对象 下篇帖子: Python多线程学习-贰-threading
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表