首页 > 其他分享 >day03

day03

时间:2023-11-09 19:22:04浏览次数:30  
标签:day03 标签 bro soup print div find

搜索文档树

find和find——all

from bs4 import BeautifulSoup

html_doc = """
<html><head><title>The Dormouse's story</title></head>
<body>
<p class="title"><b>The Dormouse's story</b><span>lqz</span></p>

<p class="story">Once upon a time there were three little sisters; and their names were
<a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>,
<a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and
<a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
and they lived at the bottom of a well.</p>

<p class="story">...</p>
"""
soup = BeautifulSoup(html_doc, 'html.parser')
# 1、五种过滤器: 字符串、正则表达式、列表、True、方法

####  字符串
# -可以按标签名,可以按属性,可以按文本内容
# - 无论按标签名,按属性,按文本内容 都是按字符串形式查找

# p=soup.find('p')
# 找到类名叫 story的p标签
# p=soup.find(name='p',class_='story')
#### 可以按标签名,可以按属性,可以按文本内容
# obj=soup.find(name='span',text='lqz')
# obj=soup.find(href='http://example.com/tillie')

# 属性可以写成这样
# obj=soup.find(attrs={'class':'title'})
# print(obj)

#### 正则  无论按标签名,按属性,按文本内容 都是按正则形式查找
# 找到所有名字以b开头的所有标签
import re

# obj=soup.find_all(name=re.compile('^b'))
# obj=soup.find_all(name=re.compile('y$'))
# obj=soup.find_all(href=re.compile('^http:'))
# obj=soup.find_all(text=re.compile('i'))
# print(obj)


### 列表  无论按标签名,按属性,按文本内容 都是按列表形式查找
# obj=soup.find_all(name=['p','a'])
# obj = soup.find_all(class_=['sister', 'title'])
# print(obj)


#  True无论按标签名,按属性,按文本内容 都是按布尔形式查找
# obj=soup.find_all(id=True)
# obj=soup.find_all(href=True)
# obj=soup.find_all(name='img',src=True)
# print(obj)


### 方法 无论按标签名,按属性,按文本内容 都是按方法形式查找
def has_class_but_no_id(tag):
    return tag.has_attr('class') and not tag.has_attr('id')

print(soup.find_all(name=has_class_but_no_id))

爬取美女图片

import requests
from bs4 import BeautifulSoup

res = requests.get('https://pic.netbian.com/tupian/32518.html')
res.encoding = 'gbk'
# print(res.text)

soup = BeautifulSoup(res.text, 'html.parser')
ul = soup.find('ul', class_='clearfix')
img_list = ul.find_all(name='img', src=True)
for img in img_list:
    try:
        url = img.attrs.get('src')
        if not url.startswith('http'):
            url = 'https://pic.netbian.com' + url
        print(url)
        res1=requests.get(url)
        name=url.split('-')[-1]
        with open('./img/%s'%name,'wb') as f:
            for line in res1.iter_content():
                f.write(line)
    except Exception as e:
        continue

bs4其他用法

遍历、搜索文档树,bs4还可以修改xml

java的配置文件一般喜欢用xml写
.conf
.ini
.yaml
.xml

find_all其它参数

limit=数字   查找几条,如果写1就是一条
recursive

css选择器

# id选择器
     #id号
# 标签选择器
    标签名
# 类选择器
    .类名
    
# 记住的:
    #id
    .sister
    head
    div>a  # div下直接子节点a
    div a  # div下子子孙孙节点a
 

# 一旦会了css选择器的用法---》以后所有的解析库都可以使用css选择器去找

案例

import requests
from bs4 import BeautifulSoup

res = requests.get('https://www.cnblogs.com/liuqingzheng/p/16005896.html')
# print(res.text)
soup = BeautifulSoup(res.text, 'html.parser')
# a=soup.find(name='a',title='下载哔哩哔哩视频')
# print(a.attrs.get('href'))

# p=soup.select('#cnblogs_post_body p:nth-child(2) a:nth-child(5)')[0].attrs.get('href')
# p=soup.select('#cnblogs_post_body > p:nth-child(2) > a:nth-child(5)')[0].attrs.get('href')  # 以后直接复制即可
p=soup.select('a[title="下载哔哩哔哩视频"]')[0].attrs.get('href')  # 以后直接复制即可
print(p)

selenium基本使用

# 这个模块:既能发请求,又能解析,还能执行js
# selenium最初是一个自动化测试工具,而爬虫中使用它主要是为了解决requests无法直接执行JavaScript代码的问题

# selenium 会做web方向的自动化测试
# appnium 会做 app方向的自动化测试

# selenium 可以操作浏览器,模拟人的 行为


# 如何使用
    1 下载浏览器驱动:https://registry.npmmirror.com/binary.html?path=chromedriver/
        https://googlechromelabs.github.io/chrome-for-testing/
        https://edgedl.me.gvt1.com/edgedl/chrome/chrome-for-testing/119.0.6045.105/win64/chromedriver-win64.zip
        跟浏览器型号和版本一一对应的
        ie,火狐,谷歌:谷歌为例
        谷歌浏览器有很多版本:跟版本一一对应
    2 安装 selenium
    3 写python代码,操作浏览器
    import time
    from selenium import webdriver
    # 跟人操作浏览器一样,打开了谷歌浏览器,拿到浏览器对象
    bro=webdriver.Chrome()
    # 在地址栏中输入地址
    bro.get('https://www.baidu.com')
    time.sleep(5)
    bro.close()
    

模拟登录

import time

from selenium import webdriver
from selenium.webdriver.common.by import By

bro = webdriver.Chrome()
bro.get('https://www.baidu.com')
bro.implicitly_wait(10)  # 设置等待---》从页面中找标签,如果找不到,就等待
# 最大化
bro.maximize_window()
# print(bro.page_source) # 当前页面的html内容
# 找到登录按钮--》选择器---》css选择器
# a_login=bro.find_element(by=By.NAME,value='tj_login')
# a_login=bro.find_element(by=By.ID,value='s-top-loginbtn')
a_login = bro.find_element(by=By.LINK_TEXT, value='登录')  # a 标签连接文字
time.sleep(2)
# 点击
a_login.click()

# 找到短信登录 点击
sms_login = bro.find_element(by=By.ID, value='TANGRAM__PSP_11__changeSmsCodeItem')
sms_login.click()
time.sleep(1)
user_login = bro.find_element(by=By.ID, value='TANGRAM__PSP_11__changePwdCodeItem')
user_login.click()
time.sleep(1)
username = bro.find_element(by=By.NAME, value='userName')
# 往输入框中写文字
username.send_keys('[email protected]')
password = bro.find_element(by=By.ID, value='TANGRAM__PSP_11__password')
# 往输入框中写文字
password.send_keys('[email protected]')

agree = bro.find_element(By.ID, 'TANGRAM__PSP_11__isAgree')
agree.click()
time.sleep(1)

submit = bro.find_element(By.ID, 'TANGRAM__PSP_11__submit')
submit.click()

time.sleep(3)
bro.close()

 

selenium其它用法

无头浏览器

# 如果我们做爬虫,我们只是为了获取数据,不需要非有浏览器在显示---》隐藏浏览器图形化界面


import time

from selenium import webdriver
from selenium.webdriver.common.by import By


from selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.add_argument('blink-settings=imagesEnabled=false') #不加载图片, 提升速度
chrome_options.add_argument('--headless') #浏览器不提供可视化页面. linux下如果系统不支持可视化不加这条会启动失败
bro = webdriver.Chrome(options=chrome_options)


bro.get('https://www.cnblogs.com/liuqingzheng/p/16005896.html')

print(bro.page_source)
time.sleep(3)
bro.close()

 

搜索标签

# 1 搜索标签
# By.ID  # 根据id号查找标签
# By.NAME  # 根据name属性查找标签
# By.TAG_NAME  # # 根据标签查找标签
# By.CLASS_NAME # 按类名找
# By.LINK_TEXT # a标签文字
# By.PARTIAL_LINK_TEXT # a标签文字,模糊匹配
#---------selenium 自己的--------
# By.CSS_SELECTOR # 按css选择器找
# By.XPATH  #按xpath找


# 2 获取标签的属性,文本,大小,位置
# print(tag.get_attribute('src'))
# print(tag.id)  # 这个id不是id号,不需要关注
# print(tag.location)
# print(tag.tag_name)
# print(tag.size)

 

案例

import time
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.common.by import By


from selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.add_argument('blink-settings=imagesEnabled=false') #不加载图片, 提升速度
chrome_options.add_argument('--headless') #浏览器不提供可视化页面. linux下如果系统不支持可视化不加这条会启动失败
bro = webdriver.Chrome(options=chrome_options)


bro.get('https://www.cnblogs.com/liuqingzheng/p/16005896.html')

#### 不建议使用----》selenium提供的查找
# soup=BeautifulSoup(bro.page_source,'html.parser')
# print(soup.find(title='下载哔哩哔哩视频').attrs.get('href'))


# selenium提供的查找
# By.ID  # 根据id号查找标签
# By.NAME  # 根据name属性查找标签
# By.TAG_NAME  # # 根据标签查找标签
# By.CLASS_NAME # 按类名找
# By.LINK_TEXT # a标签文字
# By.PARTIAL_LINK_TEXT # a标签文字,模糊匹配
#---------selenium 自己的--------
# By.CSS_SELECTOR # 按css选择器找
# By.XPATH  #按xpath找

#### 找到标签后,获取标签属性,文本,位置,大小等
# print(tag.get_attribute('src'))
# print(tag.id)  # 这个id不是id号,不需要关注
# print(tag.location)
# print(tag.tag_name)
# print(tag.size)
div=bro.find_element(By.ID,'cnblogs_post_body')
# res=div.get_attribute('class')   # 获取标签属性
print(div.get_attribute('class'))
print(div.id)  # 这个id不是id号,不需要关注
print(div.location) # 在页面中位置: x y轴效果---》
print(div.tag_name) # 标签名
print(div.size) # 标签大小  x y
print(div.text) # 文本内容


## 找到页面中所有div
# divs=bro.find_elements(By.TAG_NAME,'div')
# print(len(divs))

# 按类名找
# div=bro.find_element(By.CLASS_NAME,'postDesc').text
# print(div)


# 按css选择器
# div=bro.find_element(By.CSS_SELECTOR,'div.postDesc').text
# div=bro.find_element(By.CSS_SELECTOR,'#topics > div > div.postDesc').text
# print(div)

# 按xpath选择---专门学xpath的语法
# div=bro.find_element(By.XPATH,'//*[@id="topics"]/div/div[3]').text
# print(div)


time.sleep(1)
bro.close()

 

标签:day03,标签,bro,soup,print,div,find
From: https://www.cnblogs.com/shanghaipudong/p/17822601.html

相关文章

  • JavaSE day03【多态、内部类、 常用API】测评题
    选择题题目1(多选):下列关于多态的前提描述正确的是()选项:​ A.继承/实现关系​ B.子父类存在同名成员变量​ C.方法重写​ D.父类的引用指向子类的对象题目2(单选):下列关于多态成员访问的特点错误的是()选项:​ A.构造方法和继承一样,子类通过super()......
  • JavaSE day03-多态 ,内部类,常用API
    JavaSEday03-多态,内部类,常用API多态内部类常用API1多态1.1面向对象三大特征?封装,继承,多态1.2什么是多态?一个对象在不同时刻体现出来的不同形态举例:一只猫对象我们可以说猫就是猫:Catcat=newCat();我们也可以说猫是动物:Animal......
  • Java 基础篇day03
    流程控制分支结构if和switchif分支根据条件(真或假)来决定执行某段代码点击查看代码if(条件表达式){代码}if(条件表达式){代码1;}else{代码2;}if(条件表达式1){代码1;}elseif(条件表达式2){代码2;}...else{代码n;}switch分支点击查看代码switch(条件......
  • hadoop集群 大数据项目实战_电信用户行为分析_day03
    配置系统环境  Reis1.先把之前的dump.rdb删除掉rm-rfdump.rdb 2.把原始项目给的dump.rdb放进来,它里面包含了需要的数据,比如端口;在这部之前必须要进行关闭端口,随后传送文件,最后重启端口相关指令:   bin/redis-server conf/redis.conf   bin/redis-cli  bin......
  • app逆向day03-反编译工具和hook框架
    一反编译工具1.1常见反编译工具常见的反编译工具:jadx(推荐)、jeb、GDA反编译工具依赖于java环境,所以我们按照jdk1.2JDK环境安装#官方地址:(需要注册-最新java21)https://www.oracle.com/java/technologies/downloads/1.2.1win平台安装#1下载jdk-8u371-windows-x64.e......
  • java学习笔记day03
    java学习笔记day03数据类型public class 数据类型 {  public static void main(String[] args){    //整数类型    byte num1 = 10;    short num2 = 200;    int num3 = 3000;    long num4 = 400000L;    ......
  • 【日常收支账本】【Day03】通过ElementTree+XPath实现对XML文件的读写
    一、项目地址https://github.com/LinFeng-BingYi/DailyAccountBook二、新增1.解析xml文件1.1功能详述解析所设计的xml文件格式,并将所得数据存入变量。点击查看xml格式<DailyAccountBook><balance><fund><value>5000.00</value>......
  • Day03 - Vue语法使用
    JS循环方式JS循环方式//方式一:js循环----->for()------>基于索引的循环leti=0for(;i<10;){console.log(i)i++}letlist=[1,2,3,4,5,6,7,8]for(letj=0;j<list.length;j++){console.log(lis......
  • day03 - 链表part01
    力扣203.移除链表元素没有难度,只需掌握一个思路,即因为每次删除元素时,我们需要该元素的前一个元素的指针来操作,那么如果删除第一个元素呢?他的前一个元素无法获取因此需要进行特殊处理,而我们可以设置一个虚拟节点作为头结点,这样链表的每个元素的处理方式就统一了。代码如下ListN......
  • day03-运算符
    Python提供了多种类型的运算符,用于执行各种操作,包括算术运算、比较运算、逻辑运算、赋值运算等。1、算数运算符运算符作用例子结果+加7+29-减7+25*乘7*214/除(保留小数点)7/23.5//整除(取商)7//......