Beautifulsoup4库学习(原文)
爬虫
Beautiful Soup
一个的英文可以从HTML
或XML
文件中提取数据的Python
库它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式。
参考:中文文档
HTML演示代码
html_doc = """
<html><head><title>The Dormouse's story</title></head>
<body>
<p class="title"><b>The Dormouse's story</b></p>
<p class="story">Once upon a time there were three little sisters; and their names were
<a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>,
<a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and
<a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
and they lived at the bottom of a well.</p>
<p class="story">...</p>
"""
基本用法
from bs4 import BeautifulSoup # 解析html,官方推荐写法
soup = BeautifulSoup(html_doc, 'lxml') # 以lxml解析器解析,本地导入写法
#soup = BeautifulSoup(open("index.html"))
soup.prettify() # 补全html代码,容错。
print(soup.prettify())
print(soup.p) # 第一个p标签
print(soup.a)
print(soup.title.string) #标题内容
print(soup.title.name) # 标题的名称
print(soup.head)
print(soup.p['class']) # p标签下class属性的值
soup.find_all('a') # 找到所有a标签
soup.find(id="link3") # 找到id值是link3的标签
for link in soup.find_all('a'):
print(link.get('href'))
print(soup.get_text()) # 从soup中获取文字
遍历文档树
1、tag的content属性可以将tag的子节点和子孙节点以**列表**的方式输出
print(soup.p.contents)
print(soup.p.contents[1])
2、children返回的不是一个 list,不过我们可以通过遍历获取所有子节点,它是一个 list 生成器对象,i是索引,child是内容。
for i,child in enumenerate(soup.p.children):
print(i,child)
3、通过子节点可获得其父节点,祖先节点,以及上下兄弟节点
soup.a.parent
soup.a.parents
soup.a.next_sliblings (下一个)
soup.a.previous_sliblings (上一个)
4,寻找节点,以下几种传递方式
soup.find_all('a') # 找到所有a标签
print(soup.find_all("a", limit=2)) #限制搜索结果数
for link in soup.find_all('a'):
print(link.get('href'))
soup.find_all(id='1')
soup.find_all(class_='name')#关键字 class 在Python中是保留字,使用 class 做参数会导致语法错误,可用class_
soup.find_all(text='文本')
print(soup.find_all(['title','b'])) # 传递列表进去,匹配到同时又两个标签相同的标签
import re
'''传递正则表达式'''
for tag in soup.find_all(re.compile("^b")):
print(tag.name)
print(soup.find_all(attrs={"class":"title"}))#attrs参数,定义一个字典参数来搜索包含特殊属性的tag
5,css选择器
soup.select("title")
soup.select("p:nth-of-type(3)")