爬虫02

二. 解析库的使用

1. XPath

1.1 常用规则

  • 更多的详见官网或者书籍,这里只列出常用的
    
属性定位:
    #找到class属性值为song的div标签
    //div[@class="song"] 
层级&索引定位:
    #找到class属性值为tang的div的直系子标签ul下的第二个子标签li下的直系子标签a
    //div[@class="tang"]/ul/li[2]/a
逻辑运算:
    #找到href属性值为空且class属性值为du的a标签
    //a[@href="" and @class="du"]
模糊匹配:
    //div[contains(@class, "ng")]
    //div[starts-with(@class, "ta")]
取文本:
    # /表示获取某个标签下的文本内容
    # //表示获取某个标签下的文本内容和所有子标签下的文本内容
    //div[@class="song"]/p[1]/text()
    //div[@class="tang"]//text()
取属性:
    //div[@class="tang"]//li[2]/a/@href

1.2 基本使用

1.2.1 HTML

该类是传一个HTML格式的字符串数据
  • 补全代码

    import requests
    # 1. 从lxml导入etree模块
    from lxml import etree
    
    text_html = '<div><h1>Hello world</h1>'
    
    # 2.实例化etree中HTML,传入一个字符串类型的数据
    
    html = etree.HTML(text_html)
    # 3.tostring可以用于补全代码,但结果为bytes类型
    result = etree.tostring(html)
    print(result)
    b'<html><body><div><h1>Hello world</h1></div></body></html>'
    
  • 爬取城市名称

    import requests
    from lxml import etree
    
    url = "https://www.aqistudy.cn/historydata/"
    headers = {
        "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36"
    }
    # 获取页面的源代码
    page_text = requests.get(url=url,headers=headers).text
    # 实例化一个对象,将源代码传入
    tree = etree.HTML(page_text)
    # li_list = tree.xpath('//div[@class="hot"]//ul/li | //div[@class="all"]//ul')  # 或| 运算符
    # 热门城市名称:
    # li_list = tree.xpath('//div[@class="hot"]//ul/li/a/text()')  # ['北京', '上海', '广州', '深圳', '杭州', '天津', '成都', '南京', '西安', '武汉']
    # 全部城市名称:
    li_list = tree.xpath('//div[@class="all"]//ul//li/a/text()')
    print(li_list)
    

1.2.2 parse

该类是传入一个html文件,如果使用etree.HTMLParser()就会在文件中加入一个DOCTYPE的声明
  • 测试

    import requests
    from lxml import etree
    
    
    headers = {
        "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36"
    }
    html = etree.parse("./test.html", etree.HTMLParser())
    result = etree.tostring(html)
    print(result)
    

    test.html

    <div><h1>Hello world</h1></div>
    

2.Beautiful Soup

  • 如果需要细看,可以看书或者百度....

2.1 常用规则

使用流程:       
    - 导包:from bs4 import BeautifulSoup
    - 使用方式:可以将一个html文档,转化为BeautifulSoup对象,然后通过对象的方法或者属性去查找指定的节点内容
        (1)转化本地文件:
             - soup = BeautifulSoup(open('本地文件'), 'lxml')
        (2)转化网络文件:
             - soup = BeautifulSoup('字符串类型或者字节类型', 'lxml')
        (3)打印soup对象显示内容为html文件中的内容

基础巩固:
    (1)根据标签名查找
        - soup.a   只能找到第一个符合要求的标签
    (2)获取属性
        - soup.a.attrs  获取a所有的属性和属性值,返回一个字典
        - soup.a.attrs['href']   获取href属性
        - soup.a['href']   也可简写为这种形式
    (3)获取内容
        - soup.a.string
        - soup.a.text
        - soup.a.get_text()
       【注意】如果标签还有标签,那么string获取到的结果为None,而其它两个,可以获取文本内容
    (4)find:找到第一个符合要求的标签
        - soup.find('a')  找到第一个符合要求的
        - soup.find('a', title="xxx")
        - soup.find('a', alt="xxx")
        - soup.find('a', class_="xxx")
        - soup.find('a', id="xxx")
    (5)find_all:找到所有符合要求的标签
        - soup.find_all('a')
        - soup.find_all(['a','b']) 找到所有的a和b标签
        - soup.find_all('a', limit=2)  限制前两个
    (6)根据选择器选择指定的内容
               select:soup.select('#feng')
        - 常见的选择器:标签选择器(a)、类选择器(.)、id选择器(#)、层级选择器
            - 层级选择器:
                div .dudu #lala .meme .xixi  下面好多级
                div > p > a > .lala          只能是下面一级
        【注意】select选择器返回永远是列表,需要通过下标提取指定的对象

3. Selenium

posted @ 2023-03-06 17:05  w随风w  阅读(4)  评论(0编辑  收藏  举报