目录
Beautiful Soup中文官方文档:https://beautifulsoup.readthedocs.io/zh_CN/v4.4.0/
beautifulsoup安装:pip install beautifulsoup4
安装解析器:pip install lxml 或者 pip install -i https://mirrors.aliyun.com/pypi/simple/ lxml
Beautiful Soup库
from bs4 import BeautifulSoup
html_str = '''
<div class="shufa-topbar">
<div class="shufa-topbar-main">
<div class="shufa-topbar-link"><a href="http://www.shufaai.com/" target="_blank">书法爱</a>www.shufaai.com<a href="http://www.shufaai.com/" target="_blank">书法</a>爱好者学习平台</div>
<div class="shufa-topbar-extend">
<span><a href="http://www.shufaai.com/" target="_blank">书法爱好者</a><i>|</i><a href="http://www.shufaai.com/a/zidian/" target="_blank">书法字典</a></span>
</div>
<div class="shufa-topbar-link"><a href="http://www.shufaai.com/" target="_blank">书法爱2</a>www.shufaai.com<a href="http://www.shufaai.com/" target="_blank">书法</a>爱好者学习平台</div>
</div>
</div>
'''
# 创建对象,括号中的参数是html文档(可以打开外部存储html文档的文件BeautifulSoup(open("index.html")),或者直接使用当前文件中的html字符串对象)和解析器名称
soup = BeautifulSoup(html_str,'lxml')
获取单个元素
# 1、获取标签,对象名.标签名,获取的对象为对应标签中的第一个元素
print(soup.a)
# 2、获取属性值,对象名.标签名['属性名']
print(soup.a['href'])
# 3、获取标签中的文本内容,对象名.标签名.text
print(soup.a.text)
获取多个亲属元素
# 1、获取所有儿子标签元素内容,返回一个迭代器对象
print(list(soup.div.children))
# 2、获取所有儿子标签元素内容,存储在列表中
print(soup.div.contents)
# 3、获取所有的后代元素,返回一个生成器对象
print(list(soup.div.descendants))
# 4、next_sibling用来获取后一个兄弟元素
print(soup.div.div.div.next_sibling.next_sibling)
# 5、next_siblings获取后面所有的兄弟元素,并返回一个迭代器对象
print(list(soup.div.div.div.next_sibling.next_siblings))
# 6、previous_sibling获取前一个兄弟元素
print(list(soup.div.div.div.next_sibling.next_siblings)[2].previous_sibling.previous_siblings)
# 7、previous_siblings获取前面所有的兄弟元素,并返回一个迭代器对象
print(list(list(soup.div.div.div.next_sibling.next_siblings)[2].previous_sibling.previous_siblings))
# 8、获取所有的父辈元素,返回一个生成器对象
print(list(soup.div.div.div.next_sibling.next_sibling.parents))
获取符合条件的所有元素(find_all过滤)
'''
常用参数介绍:
find_all(self, name=None, attrs={}, recursive=True, text=None,limit=None, **kwargs)
name:标签名查找
attrs:属性查找
recursive:是否递归,如果false,只能查找到符合对应的子元素
text:通过标签元素的文本内容获取
limit:设置返回的设置数量的结果
'''
print(soup.find_all('a'))
print(soup.find_all(attrs={"target":"_blank"}))
print(soup.find_all('a',text='书法爱'))
css选择器(select()方法)
见:(自动化)https://blog.csdn.net/JBY2020/article/details/111301327
(web网页编写)https://blog.csdn.net/JBY2020/article/details/109633720
print(soup.select('.shufa-topbar-link'))
lxml库
from lxml import etree
html_str = '''
<div class="shufa-topbar">
<div class="shufa-topbar-main">
<div class="shufa-topbar-link"><a href="http://www.shufaai.com/" target="_blank">书法爱</a>www.shufaai.com<a href="http://www.shufaai.com/" target="_blank">书法</a>爱好者学习平台</div>
<div class="shufa-topbar-extend">
<span><a href="http://www.shufaai.com/" target="_blank">书法爱好者</a><i>|</i><a href="http://www.shufaai.com/a/zidian/" target="_blank">书法字典</a></span>
</div>
<div class="shufa-topbar-link"><a href="http://www.shufaai.com/" target="_blank">书法爱2</a>www.shufaai.com<a href="http://www.shufaai.com/" target="_blank">书法</a>爱好者学习平台</div>
</div>
</div>
'''
# 构造html标签对象
page_html = etree.HTML(html_str)
返回对应的标签元素对象
xpath中的参数为xpath表达式:更多方法见(https://blog.csdn.net/JBY2020/article/details/111301327)
print(page_html.xpath('//div/a'))
# @属相名,用来获取属性值
print(page_html.xpath('//div/a/@target'))
# text(),用来获取标签文本内容
print(page_html.xpath('//div/a/text()'))
// 相对路径
/绝对路径
. 当前节点
.. 当前节点的父节点
@根据属性
。。。。。。。。。