BeautifulSoup库的使用

来源:互联网 发布:匡恩网络 招聘 编辑:程序博客网 时间:2024/06/06 23:58


  • 灵活方便的网页解析库,处理高效,支持多种解析器
  • 是python的一个库,通过解析文档为用户提供需要抓取的数据
  • 自动将输入文档转换为Unicode编码,输出文档转换为utf-8编码。
  • 不用编写复杂的正则表达式提取网页信息(代替正则)

安装:

pip35 install beautifulsoup4pip35 install lxml# lxml解析器更加强大,速度更快pip35 install html5lib
创建 Beautiful Soup 对象
soup = BeautifulSoup(html)# 用本地HTML文件来创建对象# soup = BeautifulSoup(open('demo.html'))<!--打印soup对象的内容-->print(soup.prettify())<!--选择了title标签,将内容打印出来-->print(soup.title.string)

常用的解析方法

标签选择器

选择元素
soup = BeautifulSoup(html, 'lxml')<!--print(soup.prettify())-->print(soup.title.string)print(soup.title)# 输出第一个返回结果<!--获取名称-->print(soup.p.string)

输出:

Title<title>Title</title>change the world by program
获取属性
soup = BeautifulSoup(html, 'lxml')print(soup.p.attrs['name'])print(soup.p['name'])

输出:

aaaaaa
获取子节点
<!--获取p标签的子节点--><p class="story" name="aaa">change the world by program    <a>aaaaaaaaaaaaaaaaaaa</a>    <a>bbbbbbbbbbbbbbbbb</a>    <a>ccccccccccccccccc</a></p><!--列表类型-->soup = BeautifulSoup(html, 'lxml')print(soup.p.contents)

输出:

['change the world by program\n    ', <a>aaaaaaaaaaaaaaaaaaa</a>, '\n', <a>bbbbbbbbbbbbbbbbb</a>, '\n', <a>ccccccccccccccccc</a>, '\n']

返回迭代器类型:

soup = BeautifulSoup(html, 'lxml')print(soup.p.children)for i, child in enumerate(soup.p.children):    print(i, child)

输出:

0 change the world by program1 <a>aaaaaaaaaaaaaaaaaaa</a>2 3 <a>bbbbbbbbbbbbbbbbb</a>4 5 <a>ccccccccccccccccc</a>6

子孙节点

soup = BeautifulSoup(html, 'lxml')print(soup.p.descendants)for i, child in enumerate(soup.p.descendants):    print(i, child)

输出:

0 change the world by program1 <a>aaaaaaaaaaaaaaaaaaa</a>2 aaaaaaaaaaaaaaaaaaa3 4 <a>bbbbbbbbbbbbbbbbb</a>5 bbbbbbbbbbbbbbbbb6 7 <a>ccccccccccccccccc</a>8 ccccccccccccccccc9
父节点和祖先节点

  • 父节点:parent
  • 祖先节点: parents
  • 兄弟节点:next_siblings
  • previous_siblings

标准选择器

html = '''<div class="panel">    <ul class="list" id="list1" name="elements">        <li class="element">aaa</li>        <li class="element">bbb</li>        <li class="element">ccc</li>    </ul>    <ul class="list list-small" id="list2">        <li class="element">111</li>        <li class="element">222</li>    </ul></div>'''
name
soup = BeautifulSoup(html, 'lxml')<!--注:ul必须与标签名一致-->for ul in soup.find_all('ul'):    print(ul.find_all('li'))

输出:

[<li class="element">aaa</li>, <li class="element">bbb</li>, <li class="element">ccc</li>][<li class="element">111</li>, <li class="element">222</li>]
attr

通过属性名获取元素:

print(soup.find_all(attrs={'id': 'list1'}))print(soup.find_all(attrs={'name': 'elements'}))

输出:

[<ul class="list" id="list1" name="elements"><li class="element">aaa</li><li class="element">bbb</li><li class="element">ccc</li></ul>]

也可以直接获取:

print(soup.find_all(id='list1'))print(soup.find_all(class_='element'))
text
print(soup.find_all(text='111'))
find

返回单个元素,find_all返回所有元素

css选择器

print(soup.select('.panel #list1'))<!--输出第一个ul-->
获取属性
for ul in soup.select('ul'):    print(ul['id'])    print(ul.attrs['id'])
获取内容
for li in soup.select('li'):    print(li.get_text())

输出:

aaabbbccc111222



原创粉丝点击