zoukankan      html  css  js  c++  java
  • Python爬虫:BeautifulSoup用法总结

    原文

    BeautifulSoup是一个解析HTML或XML文件的第三方库。HTML或XML文件可以用DOM模型解释。一般包含三种节点:

    • 元素节点 - 通常指HTML 或 XML的标签
    • 文本节点 - 标签内部的文本内容
    • 属性节点 - 每个标签的属性

    BeautifulSoup库可以对HTML或XML文件解析,查找到一个或多个标签元素,并获取每个标签里的文本和属性。

    BeautifulSoup很好的特性是它接受一个str或byte对象后会对编码自动检测,并对当前文档编码并转换成Unicode编码。这样可以不用担心乱码问题。

    安装: pip install beautifulsoup4

    使用: from bs4 import BeautifulSoup

    推荐安装: pip install lxml, 比 python自带的解析库html.parser更快

     BeautifulSoup库的使用方法:

    对一个元素的查找主要有3种方法:

    • 根据标签名直接查找:soup.title, soup.p .仅适用于查找单个元素
    • 使用find 和 find_all 方法 - 根据标签名和属性对文档遍历查找提取一个或多个元素
    • 使用select方法 - 根据css 样式选择器对文档进行遍历提取一个或多个元素
    # 根据tag直接获取元素
    soup.p #获取p标签元素对象,只获取第一个
    soup.p.name #获取p标签的名字,即'p"
    soup.p.string # 获取p标签元素内的文本
    soup.p['class'] #获取p标签元素的class属性
    soup.p.get('class') #等同于上述案例
    soup.a['href'] #获取第一个a元素的href属性
    
    
    # find_all方法。find方法类似,仅用于提取首个匹配元素
    # find_all( name , attrs , recursive , text , **kwargs )
    #  name :要查找的标签名(字符串、正则、方法、True)
    #  attrs: 标签的属性
    #  recursive: 递归
    #  text: 查找文本
    # **kwargs :其它 键值参数
    # 因class是关键字,所以要写成class_="value", 等同于attrs={"class":"value"}
    soup.find_all('p')  # 以列表形式返回所有p标签
    soup.find_all('p', attrs={"class":"sister"})  # 以列表形式返回所有class属性==sister的p标签
    soup.find_all('p', class_="sister")  # 以列表形式返回所有class属性==sister的p标签
    soup.find_all(id='link2')  # 返回所有id属性==link2的标签
    soup.find_all(re.compile("^b"))  # 使用正则查找标签以b开头的元素
    soup.find_all(href=re.compile("elsie")) # 使用正则, 返回所有href属性包含elsie的标签
    soup.find_all(id="link1", href=re.compile('elsie'))  # id=link1且href包含elsie的标签
    
    
    # select方法 - css选择器
    # 注意select方法提取的元素均是列表形式,获取文本时注意加index
    soup.select('p') # 根据标签名查找所有p元素,等于soup.find_all('p')
    soup.select('.sister') # 通过css属性查找class=sister的标签
    soup.select('#link1') # 通过id查找所有id=#link1的元素
    soup.select('p #link1') # 组合查找id=#link11的p元素
    soup.select("head > title") # 查找head标签的子元素title
    soup.select('a[class="sister"]') # 查找所有属性为sister的a标签
    soup.select('a[href="http://example.com/elsie"]') #查找href=xxx的a标签元素
    soup.select('p')[0].get_text() # 获取首个p元素的文本
    soup.select('a[href*=".com/el"]')[0].attrs['href'] #获取xxx.com的href

    除了 find()和find_all()之外,还有一些常用的方法可用来搜索父子和兄弟节点:

    find_parent()

    find_parents()

    find_next_sibling()

    find_next_siblings()

    find_previous_sibling()

    find_previous_siblings()

    find_next()
    find_previous()
    find_all_next()
    find_all_previous()

    请注意select方法和find方法有如下区别,使用时请注意:

    • find方法返回的是单个元素,find_all方法返回的是一个元素列表,而select方法永远返回的是元素列表。如果你使用了select方法查找到了单个元素,别忘了先加列表索引[0],然后才可以调用get_text()方法获取文本。

    • find方法还支持方法参数查询,比select方法更强大,如下所示:

      def has_class_no_id(tag):
          return tag.has_attr("class") and not tag.has_attr("id")
      soup.find_all(has_class_no_id)  # 支持方法参数
  • 相关阅读:
    HDU 1850 Being a Good Boy in Spring Festival
    UESTC 1080 空心矩阵
    HDU 2491 Priest John's Busiest Day
    UVALive 6181
    ZOJ 2674 Strange Limit
    UVA 12532 Interval Product
    UESTC 1237 质因子分解
    UESTC 1014 Shot
    xe5 android listbox的 TMetropolisUIListBoxItem
    xe5 android tts(Text To Speech)
  • 原文地址:https://www.cnblogs.com/ahMay/p/11995209.html
Copyright © 2011-2022 走看看