爬虫

发布时间 2024-01-04 13:55:28作者: Magiclala

用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