用with读取文件
# './素材/三国演义.html'是文件路径,'r'表示读取模式,encoding='UTF-8'指定编码为UTF-8
with open('./素材/三国演义.html', mode='r', encoding='UTF-8') as file:
# 读取文件内容并将其保存在变量data中
data = file.read()
用with写入文件
with open('../练习答案/股票2.html', mode='w', encoding="gbk") as file:
file.write(tbodyData[0])
使用bs4中的BeautifulSoup库解析HTML内容 ,'lxml'是指定解析器的一种,它是一个快速而灵活的XML和HTML解析库。
from bs4 import BeautifulSoup
with open('./素材/豆瓣.html', 'r', encoding='UTF-8') as f:
data = f.read()
soup = BeautifulSoup(data, 'lxml')
获取div标签(只查找第一个div标签)
print(soup.div)
.attrs
获取标签有哪些属性
print(soup.div.attrs) # 查看div都有哪些属性值
# {'id': 'db-global-nav', 'class': ['global-nav']}
print(soup.find('div', attrs={"class": "detail-frame"}))
# find第一个,从<div class="detail-frame">到</div>里面的所有内容
print(soup.div.attrs['id']) # 获取当前div的id属性值
# db-global-nav
print(soup.div.attrs['class']) # 获取当前div的class属性值
# ['global-nav']
.find
查找(find只查找第一个符合的值,不会继续向后查询)
# 查找span标签中,class类为"font-small color-lightgray"的值
print(soup.find('span', class_="font-small color-lightgray"))
# 查找<span>标签中,class类为"fleft gray-link",id值为"icp"的值
print(soup.find('span', class_="gray-link", id="icp"))
这里需要特别注意
- 因为
class
是python中类的关键字,因此需要特殊处理为class_
(一般在html中只有class这个需要特殊处理,别的到目前还没有出现过) class_="fleft gray-link"
这里可以只取"gray-link"
或"fleft"
其中任意一个,也可以都取。这里是且的逻辑关系
执行结果1:
<span class="font-small color-lightgray">评分9.7</span>
执行结果2:
<span id="icp" class="fleft gray-link">
<p>
© 2005-2017 douban.com, all rights reserved 北京豆网科技有限公司
</p>
</span>
.find
和.
组合使用
print(soup.find('a', class_="cover"))
print(soup.find('a', class_="cover").img) # 获取里面的img
print(soup.find('a', class_="cover").img.attrs) # 获取里面的img 属性
print(soup.find('a', class_="cover").img.attrs['src']) # 获取里面的img 属性
print(soup.find('a', class_="cover").img['src']) # 获取里面的img 属性
print(soup.find('a', class_="cover").find('img')) # 获取里面的img 属性
print(soup.find('a', class_="cover").img) # 获取里面的img 属性
print(type(soup.find('a', class_="cover").img)) # 查看类型
.find
一层一层的拿内容
html的内容架构如下:
<div class="article">
<h2>虚构类 · · · · · · </h2>
<ul class="cover-col-4 clearfix">
<li>
<a class="cover" href="https://book.douban.com/subject/27104959/"><img src="https://img3.doubanio.com/mpic/s29535271.jpg"/></a>
<div class="detail-frame">
<h2>
<a href="https://book.douban.com/subject/27104959/">离开的,留下的</a>
</h2>
</div>
</li>
</ul>
通过使用.ul
和.h2
逐一查找数据
print(soup.find("div", class_="article").ul.h2)
print(soup.find('div', class_="article").h2.a.string) # 如果标签还有嵌套 则为None
print(soup.find('div', class_="detail-frame").h2.a.text)
print(soup.find('div', class_="detail-frame").h2.a.get_text()) # 等同于text
print(repr(soup.find('div', class_="article").text))
当前内容的类型如果是标签"bs4.element.Tag"
的话,写入到文件中 注意 需要类型转换为字符串str()
print(type(soup.find('a', class_="cover").img))
with open('save.txt', 'w') as f:
f.write(str(soup.find('a', class_="cover").img))
#执行结果
<class 'bs4.element.Tag'>
进程已结束,退出代码0