头图

XPath 案例补充+Beauitful Soup入门

XPath 案例补充

1. index 的使用

from lxml import etree
import csv

html = """
<html>
    <head>
        <title>测试</title> 
    </head>
    <body>
         <li class="item-0">first item</li>
         <li class="item-1">second item</li>
         <li class="item-inactive">third item</li>
         <li class="item-1">fourth item</li>
         <div>
            <li class="item-0">fifth item</li>
         </div>
         <span>
            <li class="item-0">sixth item</li>
            <div>
                <li class="item-0">eighth item</li>
            </div>
         </span>
     </body>
</html>
"""

tree = etree.HTML(html)
# [m:n] 左闭右开
texts = tree.xpath('//li/text()')[:3]
cs = tree.xpath('//li/@class')[:3]
# print(texts)  # ['first item', 'second item', 'third item']
# print(cs)  # ['item-0', 'item-1', 'item-inactive']

# 定义一个列表 用来存放所有数据
lst_data = []
for c in cs:
    # 定义一个字典 用来存放一条数据
    d ={}
    # print(c)
    lst_index = cs.index(c)  # 获得c所对应的索引
    # print(lst_index)
    # print(texts[lst_index])  # cs中c所对应的texts值
    d['class'] = c
    d['text'] = texts[lst_index]
    # print(d)
    lst_data.append(d)
print(lst_data)  # [{'class': 'item-0', 'text': 'first item'}, {'class': 'item-1', 'text': 'second item'}, {'class': 'item-inactive', 'text': 'third item'}]

# 保存数据
header = ['class', 'text']
with open('data.csv', 'w', encoding='utf-8', newline='') as f:
    w = csv.DictWriter(f, header)
    w.writeheader()
    w.writerows(lst_data)

2. 豆瓣 TOP250 爬取
(1)目标:练习XPath的使用
(2)步骤:a. 发送请求 获取响应 得到html文件 --> b. 解析数据 获得所需数据 存放字典列表z中 --> c. 保存数据于csv文件中
(3)需要用到的工具:requests lxml csv
(4)进行翻页处理( ?)

import requests
from lxml import etree
import csv


# 发请求 获相应
# url就是发起请求的目标url
def get_source(url):
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
    }
    res = requests.get(url, headers=headers)
    html = res.content.decode('utf-8')
    # print(html)
    return html


# 解析数据
def parsed_source(html):
    # 将网页源码加载成一个element对象
    tree = etree.HTML(html)
    # text() 获取文本数据
    # title = tree.xpath('//div[@class="info"]/div[@class="hd"]/a/span/text()')
    # print(title)
    divs = tree.xpath('//div[@class="info"]')
    # print(len(divs))
    # 用来存放所有数据的大列表
    lst_data = []
    for div in divs:
        # 用来存储一条数据的字典
        d = {}
        # print(div)
        # 列表的下标索引值是从0开始的
        # strip()用来处理字符串里面头和尾的空白字符
        title = div.xpath('./div[@class="hd"]/a/span/text()')[0].strip()
        score = div.xpath('./div[@class="bd"]/div[@class="star"]/span[@class="rating_num"]/text()')[0].strip()
        # span[last()] 获取最后一个span标签
        com_num = div.xpath('./div[@class="bd"]/div[@class="star"]/span[last()]/text()')[0].strip()
        quote = div.xpath('./div[@class="bd"]//span[@class="inq"]/text()')[0].strip()
        link_url = div.xpath('./div[@class="hd"]/a/@href')[0]
        d['title'] = title
        d['score'] = score
        d['com_num'] = com_num
        d['quote'] = quote
        d['link_url'] = link_url
        # print(title, score, com_num, quote, link_url)
        # 把存放一条数据的字典插入列表
        lst_data.append(d)
    # print(lst_data)
    return lst_data


# 保存数据
def save_data(lst_data, header):
    # w-->写 从头开始写  a-->追加
    with open('movie_data.csv', 'a', encoding='utf-8', newline='') as f:
        w = csv.DictWriter(f, header)
        # 写入表头
        w.writeheader()
        # writerows 一次性写入多行数据
        w.writerows(lst_data)

# 主函数 调用函数
def main():
    url = 'https://movie.douban.com/top250?start=0'
    h = get_source(url)
    header = ['title', 'score', 'com_num', 'quote', 'link_url']
    movie_data = parsed_source(h)
    save_data(movie_data, header)

if __name__ == '__main__':
    main()

Beautiful Soup入门

基础知识

  1. 定义:Beautiful Soup 是一个可以从HTML或XML文件中提取数据的网页信息提取库
  2. 作用:用来解析和提取数据的
  3. 对比不同数据解析方式
    (1)正则表达式 复杂
    (2)XPath 语法 例如/ //等
    (3)bs4 方法 例如find() fing_all()

bs4源码分析

  1. structure页面 导航页面 展示架构
  2. 图标
    (1)c class 类
    (2)m method 方法
    (3)f field 字段
    (4)p property 装饰器
    (5)v variable 变量

    image.png


国民好姐姐
1 声望1 粉丝

天生我才必有用,千金散尽复还来


« 上一篇
python爬虫 Day 8