爬虫:页面解析 -- BeautifulSoup库的使用

摘要

BeautifulSoup是一个用于解析html页面、xml文档等文件的python模块,它的使用非常简单,它的重点在于find和find_all方法的使用。不过它也存在着一定的劣势,查找速度比使用正则表达式和Xpath的速度要慢

说明

以下代码默认已导入bs4模块和BeautifulSoup类

    import bs4 
    from bs4 import BeautifulSoup

熬一碗美味汤

    soup = BeautifulSoup(html, "html.parser")

以上代码成功创建了一个soup对象,其中
html: 可以是html页面(dom元素)的字符串,如<p>This is a paragraph</p>
也可以是html文件,如open("index.html")。总的来说,html是html文件的内容
"html.parser": 这是一个html的解析器,其它可选择的解析器有"lxml"、"xml"、"html5lib"

BeautifulSoup的元素:

常用元素:
Tag: 标签,即html页面中一对标签组成的结点对象,
        获取方法为soup.tagName,其中tagName是标签名字,如soup.a表示获取html页面的a标签
Attribute: 标签属性,如<p class="statement"></p>的其中一个属性是class,
        获取属性列表的方法为Tag.attrs

不常用元素:
Name: 标签名字,如<p></p>的名字是p,获取方法为Tag.name
NavigableString: 标签文本,如<p>statement</p>的文本是statement,获取方法为tag.string
Comment: 注释,如≶p><p>的注释是comment,获取方法为tag.string

可以发现,NavigableString和Comment的获取方法相同,tag.string的类型通过以下规则区分:

  1. 如果tag中只有注释,那么返回类型为Comment;
  2. 如果tag中只有文本,那么返回类型为NavigableString;
  3. 如果tag中既含有注释,又有文本,那么返回类型为None;

为什么NavigableString是不常用的元素呢?
因为我们获取元素文本时,常常倾向于获取字符串,而NavigableString不是字符串类型。
我们通常使用tag.text来获取元素的文本字符串

获取相关标签结点的方法

常用:
以下“{}”表示或者的意思,如tag{soup}表示tag或者soup

  1. find和find_all函数
    功能:
    findAll(tag, attributes, recursive, text, limit, **keywords): 获取一个筛选后的标签
    find(tag, attributes, recursive, text, **keywords): 获取所有筛选后的标签组成的列表
    调用方式:
    tag{soup}.find(...)
    tag{soup}.find_all(...)
    其中,tag{soup}.find_all(...) 可以缩写成tag{soup}(...);...表示参数列表
    参数解释:
    tag: 字符串类型,通过标签类型查找, 如"a", "span"等
    attributes:字典类型,通过元素属性查找,如:findAll(attributes={"class":{"green", "red"}})表示查找class为green和red的元素
    recusive bool类型,True表示查找范围为所有后代元素;False表示查找范围只是子元素,默认为True
    text: 字符串类型,通过标签文本内容查找,如: findAll(text="I")表示查找文本含有I的元素
    limit:整型,只有findAll才有,限制查找元素的个数
    keywords: 字典类型,可以选择具有指定参数的元素,如:find(id="ele")表示查找id为ele的元素

  2. 获取儿子标签结点、子孙结点
    tag{soup}.children 迭代类型,儿子标签结点
    tag{soup}.descendants 迭代类型,子孙标签结点
    tag{soup}.contents 列表类型,儿子标签结点

不常用:

  1. 获取兄弟结点、父亲结点、祖先结点
    tag.previous_sibling: 标签类型,前一个兄弟结点
    tag.next_sibling: 标签类型,后一个兄弟结点
    tag.previous_siblings: 迭代类型,前面所有的兄弟结点
    tag.next_siblings: 迭代类型,后面所有的兄弟结点
    tag.parent: 标签类型,父亲结点
    tag.parents: 迭代类型,所有的祖先结点
  2. lambda表达式
    soup.findAll(lambda tag: len(tag.attrs)) 获取有两个属性的元素

以上知识基本上够用了,下面是遍历标签树的方法:

    # 下行遍历:
    # 遍历儿子结点
    for child in soup.body.children:
        print(child)
    # 遍历子孙结点
    for descendant in soup.body.descendants:
        print(descendant)
    
    # 上行遍历
    # 遍历
    for parent in soup.a.parents:
        if parent is None:
            print(parent)
        else:
            print(parent.name)
    
    # 平行遍历
    # 平行遍历发生在同一个父节点下 # 包括空结点
    # 遍历后序结点:
    for sibling in soup.a.next_siblings:
        print(sibling)
    # 遍历前序结点:
    for sibling in soup.a.previous_siblings:
        print(sibling)  
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,830评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,992评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,875评论 0 331
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,837评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,734评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,091评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,550评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,217评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,368评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,298评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,350评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,027评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,623评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,706评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,940评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,349评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,936评论 2 341

推荐阅读更多精彩内容