Python3 爬虫学习笔记 C04 【自动化测试工具 Selenium】


Python3 爬虫学习笔记第四章 —— 【自动化测试工具 Selenium】

文章目录

  • 【4.1】下载驱动
  • 【4.2】声明浏览器对象
  • 【4.3】访问页面
  • 【4.4】启动参数
  • 【4.5】查找节点
    • 【4.5.1】查找单个节点
    • 【4.5.2】查找多个节点
  • 【4.6】节点交互
  • 【4.7】动作链
  • 【4.8】执行 JavaScript
  • 【4.9】禁用加载
  • 【4.10】获取节点信息
    • 【4.10.1】获取属性
    • 【4.10.2】获取文本值
    • 【4.10.3】获取 ID、位置、标签名、大小
  • 【4.11】延时等待
    • 【4.11.1】隐式等待
    • 【4.11.2】显式等待
  • 【4.12】Cookies
  • 【4.13】前进与后退
  • 【4.14】选项卡


Selenium 是一个用于 Web 应用程序测试的工具。Selenium 测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera等。利用它可以驱动浏览器执行特定的动作,如点击、下拉等操作,同时还可以获取浏览器当前呈现的页面的源代码,做到可见即可爬。对于一些 JavaScript 动态渲染的页面来说,此种抓取方式非常有效。本文重点以 Selenium 使用谷歌浏览器的 Webdriver 为例。


【4.1】下载驱动

使用 Selenium 操作不同浏览器,需要不同浏览器相应的驱动支持:

浏览器驱动名称下载地址备注
谷歌浏览器chromedriver点击进入下载页面需要根据自己浏览器的版本下载不同版本的驱动
火狐浏览器geckodriver点击进入下载页面需要根据自己的操作系统下载对应的驱动
IEIEDriverServer点击进入下载页面根据自己 selenium 版本和系统版本下载对应版本的驱动, selenium 版本可以在cmd中输入pip show selenium查看

【4.2】声明浏览器对象

不同浏览器的对象声明方法:

from selenium import webdriverbrowser = webdriver.Chrome()  # 谷歌浏览器
browser = webdriver.Firefox()  # 火狐浏览器
browser = webdriver.Edge()  # Edge
browser = webdriver.PhantomJS()  # PhantomJS无界面浏览器
browser = webdriver.Safari()  # Safari浏览器

【4.3】访问页面

from selenium import webdriverpath = r'F:\PycharmProjects\Python3爬虫\chromedriver.exe'
browser = webdriver.Chrome(executable_path=path)
browser.get('https://www.itrhx.com')
print(browser.page_source)
browser.close()

运行代码就会自动打开谷歌浏览器,实现了用 get() 方法访问 www.itrhx.com ,path 里面的内容是谷歌浏览器驱动的目录, r 表示不转义,使用真实字符。print(browser.page_source) 表示打印页面源代码

【4.4】启动参数

Chrome Options 是一个 Chrome 的参数对象,在此对象中使用 add_argument() 方法可以添加启动参数,添加完毕后可以在初始化 Webdriver 对象时将此 Options 对象传入,则可以实现以特定参数启动Chrome。
示例:

from selenium import webdriver
from selenium.webdriver.chrome.options import Optionspath = r'F:\PycharmProjects\Python3爬虫\chromedriver.exe'# 实例化一个启动参数对象
chrome_options = Options()
# 添加启动参数
chrome_options.add_argument('--window-size=1366,768')
# 将参数对象传入Chrome,则启动了一个设置了窗口大小的Chrome
browser = webdriver.Chrome(executable_path=path, chrome_options=chrome_options)
browser.get('http://www.itrhx.com')

这样就启动了一个1366x768分辨率的浏览器
常见的启动参数:

启动参数作用
–user-agent=""设置请求头的 User-Agent
–window-size=xxx, xxx设置浏览器分辨率
–headless无界面运行
–start-maximized最大化运行
–incognito隐身模式
–disable-javascript禁用javascript
–disable-infobars禁用“浏览器正在被自动化程序控制”的提示

所有的启动参数:https://peter.sh/experiments/chromium-command-line-switches/

【4.5】查找节点

Selenium 可以驱动浏览器完成各种操作,比如填充表单、模拟点击等。要完成这些操作,实现要知道在哪里点击,哪里填充,这就是 Selenium 节点查找

【4.5.1】查找单个节点

所有获取单个节点的方法:

  • find_element_by_id 【通过元素的 id 来选择】
    例:<div id='bdy-inner'>test</div>,查找:driver.find_element_by_id('bdy-inner')

  • find_element_by_name 【通过元素的 name 来选择】
    例:<input name="username" type="text" />,查找:driver.find_element_by_name('password')

  • find_element_by_xpath 【通过 xpath 选择】
    例:<form id="loginForm">,查找:driver.find_element_by_xpath("//form[@id='loginForm']")

  • find_element_by_link_text 【通过链接地址选择】
    例:<a href="continue.html">continue</a>,查询:driver.find_element_by_link_text('continue')

  • find_element_by_partial_link_text 【通过链接的部分地址选择】
    例:<a href="continue.html">continue</a>,查询:driver.find_element_by_link_text('cont')

  • find_element_by_tag_name 【通过元素的名称选择】
    例:<h1>welcome<h1>,查询:driver.find_element_by_tag_name('h1')

  • find_element_by_class_name 【通过元素的 class 选择】
    例:<p class="content">welcome to TRHX'S BLOG!</p>,查询:driver.find_element_by_class_name('content')

  • find_element_by_css_selector 【通过元素的 class 选择】
    例:<div class='bdy-inner'>test</div>,查询:driver.find_element_by_css_selector('div.bdy-inner')

  • find_element() 【通用方法,需要传递两个参数:查找方式 By 和值】
    例:driver.find_element_by_id('inner') 等价于 find_element(By.ID, inner),使用时需要from selenium.webdriver.common.by import By

示例:

from selenium import webdriverpath = r'F:\PycharmProjects\Python3爬虫\chromedriver.exe'
browser = webdriver.Chrome(executable_path=path)
browser.get('https://www.itrhx.com')
blog_title = browser.find_elements_by_class_name(('title'))
print(blog_title[0].text)
browser.close()

输出结果:

TRHX'S BLOG

【4.5.2】查找多个节点

所有获取多个节点的方法:(与查找单个节点的区别是 element 多加了个 s)

  • find_elements_by_id
  • find_elements_by_name
  • find_elements_by_xpath
  • find_elements_by_link_text
  • find_elements_by_partial_link_text
  • find_elements_by_tag_name
  • find_elements_by_class_name
  • find_elements_by_css_selector
  • find_elements()

示例:

from selenium import webdriver
from selenium.webdriver.common.by import Bypath = r'F:\PycharmProjects\Python3爬虫\chromedriver.exe'
browser = webdriver.Chrome(executable_path=path)
browser.get('https://www.itrhx.com')
article_title = browser.find_elements(By.XPATH, "//h2[@class='title']")
print(article_title)
browser.close()

【4.6】节点交互

Selenium 可以驱动浏览器来执行一些操作,也就是说可以让浏览器模拟执行一些动作。称为节点交互,比较常见的用法有:

  • send_keys:模拟按键输入
  • clear:清除元素的内容
  • click:单击元素
  • submit:提交表单

示例:

from selenium import webdriver
from selenium.webdriver.common.keys import Keyspath = r'F:\PycharmProjects\Python3爬虫\chromedriver.exe'
browser = webdriver.Chrome(executable_path=path)
browser.get('https://www.itrhx.com')
search = browser.find_element_by_xpath('//div[@class="cover-wrapper"]/cover/div/form/input')
search.send_keys("Python")
search.send_keys(Keys.ENTER)

此处模拟了键盘,需要导入键盘类 Keys(),send_keys(Keys.ENTER)表示模拟回车键,程序首先打开 www.itrhx.com ,也就是我的博客,然后通过 xpath 找到搜索框,输入 Python 并回车,等待结果显示出来
更多节点交互动作:https://selenium-python.readthedocs.io/api.html#module-selenium.webdriver.remote.webelement

【4.7】动作链

Selenium 还有另外一些操作,它们没有特定的执行对象,比如鼠标拖曳、键盘按键等,这些动作用另一种方式来执行,那就是动作链。以一个拖曳实例为例:http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable

from selenium import webdriver
from selenium.webdriver import ActionChainspath = r'F:\PycharmProjects\Python3爬虫\chromedriver.exe'
browser = webdriver.Chrome(executable_path=path)
url = 'http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable'
browser.get(url)
browser.switch_to.frame('iframeResult')
source = browser.find_element_by_css_selector('#draggable')
target = browser.find_element_by_css_selector('#droppable')
actions = ActionChains(browser)
actions.drag_and_drop(source, target)
actions.perform()

依次选中要拖曳的节点和拖曳到的目标节点,接着声明 ActionChains 对象并将其赋值为 actions 变量,然后通过调用 actions 变量的 drag_and_drop() 方法,再调用 perform() 方法执行动作,此时就完成了拖曳操作,更多动作链操作:https://selenium-python.readthedocs.io/api.html#module-selenium.webdriver.common.action_chains

【4.8】执行 JavaScript

Selenium API 并没有提供执行 JavaScript 的方法,但是实际上是可以实现的。比如,下拉进度条,它可以直接模拟运行 JavaScript,此时使用 execute_script() 方法即可实现
示例:

from selenium import webdriverpath = r'F:\PycharmProjects\Python3爬虫\chromedriver.exe'
browser = webdriver.Chrome(executable_path=path)
browser.get('https://www.itrhx.com')
browser.execute_script('window.scrollTo(0, document.body.scrollHeight)')
browser.execute_script('alert("已到达最底端!")')

以上代码实现了利用 execute_script() 方法将进度条下拉到最底部,然后弹出 alert 提示框。

【4.9】禁用加载

使用Selenium 时,限制图片和 Javascript 执行,从而提高网页加载速度。

from selenium import webdriverpath = r'F:\PycharmProjects\Python3爬虫\chromedriver.exe'options = webdriver.ChromeOptions()
prefs = {'profile.default_content_setting_values': {'images': 2,'notifications' : 2,  # 禁用弹窗'javascript': 2  # 2即为禁用的意思}
}
options.add_experimental_option('prefs', prefs)
browser = webdriver.Chrome(executable_path=path, chrome_options=options)
browser.get('http://www.itrhx.com')

【4.10】获取节点信息

通过 page_source 属性可以获取网页的源代码,然后可以使用解析库(如正则表达式、Beautiful Soup等)来提取相关信息,Selenium 已经提供了选择节点的方法,返回的是 WebElement 类型,它也有相关的方法和属性来直接提取节点信息,如属性、文本等。就不需要再次使用解析库来提取信息了

【4.10.1】获取属性

使用 get_attribute() 方法来获取节点的属性:

from selenium import webdriverpath = r'F:\PycharmProjects\Python3爬虫\chromedriver.exe'
browser = webdriver.Chrome(executable_path=path)
url = 'http://www.itrhx.com'
browser.get(url)
meta = browser.find_element_by_id('header-meta')
print(meta)
print(meta.get_attribute('class'))

输出结果:

<selenium.webdriver.remote.webelement.WebElement (session="d03cdaa497441d2e2a5161139b4a7ea5", element="83f8fff9-60d7-4e9a-ade3-a8e97c9f0844")>
meta

【4.10.2】获取文本值

每个 WebElement 节点都有 text 属性,直接调用这个属性就可以得到节点内部的文本信息,相当于 Beautiful Soup 的 get_text() 方法、pyquery 的 text() 方法
示例:

from selenium import webdriverpath = r'F:\PycharmProjects\Python3爬虫\chromedriver.exe'
browser = webdriver.Chrome(executable_path=path)
url = 'http://www.itrhx.com'
browser.get(url)
footer_info = browser.find_element_by_id('footer')
print(footer_info.text)

输出结果:

Copyright 2018-2019 TRHX'BLOG   |   鄂ICP备19003281-4  |   本站已勉强存活了 37620 小时 5752|   站点地图  |   站长统计PoweredHexo HostedGitHub DNRAliyun CDNjsDelivr ThemeMaterial X BY-NC-SA 4.0 Link996.ICU UV4898 PV22066 WordCount54.9k

【4.10.3】获取 ID、位置、标签名、大小

其他属性,比如 id 属性可以获取节点 id,location 属性可以获取该节点在页面中的相对位置,tag_name 属性可以获取标签名称,size 属性可以获取节点的大小等
示例:

from selenium import webdriverpath = r'F:\PycharmProjects\Python3爬虫\chromedriver.exe'
browser = webdriver.Chrome(executable_path=path)
url = 'http://www.itrhx.com'
browser.get(url)
readmore = browser.find_element_by_class_name('readmore')
print(readmore.id)
print(readmore.location)
print(readmore.tag_name)
print(readmore.size)

输出结果:

7df561d3-7ea4-4b90-96aa-64044060bb47
{'x': 50, 'y': 1063}
div
{'height': 39, 'width': 465}

【4.11】延时等待

在 Selenium 中,get() 方法会在网页框架加载结束后结束执行,某些页面有额外的 Ajax 请求,若此时立即获取 page_source,可能并不是浏览器完全加载完成的页面,这里需要延时等待一定时间,确保节点已经加载出来

【4.11.1】隐式等待

当查找节点的时候,节点并没有立即出现,隐式等待将等待一段时间再查找该节点,使用 implicitly_wait() 方法可以实现隐式等待

from selenium import webdriverpath = r'F:\PycharmProjects\Python3爬虫\chromedriver.exe'
browser = webdriver.Chrome(executable_path=path)
browser.implicitly_wait(10)
browser.get('https://www.itrhx.com')
readmore = browser.find_element_by_class_name('readmore')
print(readmore)

【4.11.2】显式等待

指定要查找的节点,然后指定一个最长等待时间。如果在规定时间内加载出来了这个节点,就立即返回查找的节点,果到了规定时间依然没有加载出该节点,则抛出超时异常

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as ECpath = r'F:\PycharmProjects\Python3爬虫\chromedriver.exe'
browser = webdriver.Chrome(executable_path=path)
browser.implicitly_wait(10)
browser.get('https://www.itrhx.com')
wait = WebDriverWait(browser, 10)
footer_info = wait.until(EC.presence_of_element_located((By.ID, 'footer')))
print(footer_info)

引入 WebDriverWait 对象,指定最长等待时间,调用它的 until() 方法,传入要等待条件 expected_conditions。比如,这里传入了 presence_of_element_located 这个条件,代表节点出现的意思,其参数是节点的定位元组,也就是 ID 为 footer 的节点。

这样可以做到的效果就是,在 10 秒内如果 ID 为 footer 的节点成功加载出来,就返回该节点;如果超过 10 秒还没有加载出来,就抛出异常。

加载成功时输出结果:

<selenium.webdriver.remote.webelement.WebElement (session="4ca7015891fded627ab680d9462e9361", element="3a80235c-9824-420b-b827-662638422765")>

加载失败时输出结果:

TimeoutException Traceback (most recent call last)
<ipython-input-4-f3d73973b223> in <module>()7 browser.get('https://www.itrhx.com')8 wait = WebDriverWait(browser, 10)
----> 9 input = wait.until(EC.presence_of_element_located((By.ID, 'footer')))

【4.12】Cookies

使用 Selenium,可以方便地对 Cookies 进行获取、添加、删除等操作:

from selenium import webdriverpath = r'F:\PycharmProjects\Python3爬虫\chromedriver.exe'
browser = webdriver.Chrome(executable_path=path)
browser.get('https://www.zhihu.com/explore')
print(browser.get_cookies())
browser.add_cookie({'name': 'TRHX', 'domain': 'www.zhihu.com', 'value': 'germey'})
print(browser.get_cookies())
browser.delete_all_cookies()
print(browser.get_cookies())

访问知乎,加载完成后,浏览器已经生成了 Cookies。调用 get_cookies() 方法获取所有的 Cookies。然后再添加一个 Cookie,传入一个字典,有 name、domain 和 value 等内容。接下来,再次获取所有的 Cookies。可以发现,结果就多了这一项新加的 Cookie。最后,调用 delete_all_cookies() 方法删除所有的 Cookies。再重新获取,发现结果就为空了
输出结果:

[{'domain': 'zhihu.com', 'expiry': 1661065738.754333, 'httpOnly': False, 'name': 'd_c0', 'path': '/', 'secure': False, 'value': '"AODi_Lod7g-PTrrXUgXb1N4MkbStCrbNlD4=|1566457741"'}, {'domain': 'zhihu.com', 'httpOnly': False, 'name': '_xsrf', 'path': '/', 'secure': False, 'value': 'aba68431-9daf-4b62-a67a-023c1a24f0e8'}, {'domain': 'zhihu.com', 'expiry': 1629529738.75427, 'httpOnly': False, 'name': '_zap', 'path': '/', 'secure': False, 'value': 'b6f63cfc-a525-4ae6-a7bf-6384bd1e0548'}, {'domain': 'www.zhihu.com', 'expiry': 1566458637.754178, 'httpOnly': False, 'name': 'tgw_l7_route', 'path': '/', 'secure': False, 'value': '116a747939468d99065d12a386ab1c5f'}]
[{'domain': 'www.zhihu.com', 'httpOnly': False, 'name': 'TRHX', 'path': '/', 'secure': True, 'value': 'germey'}, {'domain': 'zhihu.com', 'expiry': 1661065738.754333, 'httpOnly': False, 'name': 'd_c0', 'path': '/', 'secure': False, 'value': '"AODi_Lod7g-PTrrXUgXb1N4MkbStCrbNlD4=|1566457741"'}, {'domain': 'zhihu.com', 'httpOnly': False, 'name': '_xsrf', 'path': '/', 'secure': False, 'value': 'aba68431-9daf-4b62-a67a-023c1a24f0e8'}, {'domain': 'zhihu.com', 'expiry': 1629529738.75427, 'httpOnly': False, 'name': '_zap', 'path': '/', 'secure': False, 'value': 'b6f63cfc-a525-4ae6-a7bf-6384bd1e0548'}, {'domain': 'www.zhihu.com', 'expiry': 1566458637.754178, 'httpOnly': False, 'name': 'tgw_l7_route', 'path': '/', 'secure': False, 'value': '116a747939468d99065d12a386ab1c5f'}]
[{'domain': 'zhihu.com', 'expiry': 1644217741.489889, 'httpOnly': False, 'name': '_xsrf', 'path': '/', 'secure': False, 'value': 'WNOjpDbNmz36B4nG1lzSAuPdTyORMX6J'}]

【4.13】前进与后退

使用 back() 方法后退,使用 forward() 方法前进,与浏览器的前进后退一样
示例:

from selenium import webdriver
import timepath = r'F:\PycharmProjects\Python3爬虫\chromedriver.exe'
browser = webdriver.Chrome(executable_path=path)
browser.get('https://www.itrhx.com/')
browser.get('https://www.baidu.com/')
browser.get('https://www.zhihu.com/')
browser.back()
time.sleep(1)
browser.forward()
browser.close()

【4.14】选项卡

和浏览器一样,在 Selenium 中也可以新建一个选项卡

from selenium import webdriver
import timepath = r'F:\PycharmProjects\Python3爬虫\chromedriver.exe'
browser = webdriver.Chrome(executable_path=path)
browser.get('https://www.itrhx.com')
browser.execute_script('window.open()')
print(browser.window_handles)
browser.switch_to.window(browser.window_handles[1])
browser.get('https://www.baidu.com')
time.sleep(1)
browser.switch_to.window(browser.window_handles[0])
browser.get('https://www.zhihu.com')

首先访问我的博客,然后调用了 execute_script() 方法,传入 window.open() 这个 JavaScript 语句开启一个新的选项卡。再调用 window_handles 属性获取当前开启的所有选项卡,返回的是选项卡的代号列表。调用 switch_to_window() 方法来切换选项卡,其中参数是选项卡的代号。
输出的选项卡代号列表:

['CDwindow-C9CADF1ED28CE44970655238552A8DCF', 'CDwindow-538D7F81E467746B7BB2D9D82E2D036E']

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/437958.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

REVERSE-COMPETITION-HWS-5TH-2022

REVERSE-COMPETITION-HWS-5TH-2022re1re2re3re1 64位exe&#xff0c;ida打开&#xff0c;来到main函数 输入的长度应为32&#xff0c;输入经过TEA加密&#xff0c;密文与已知的cipher进行比较 进入TEA函数&#xff0c;发现是魔改TEA&#xff0c;需一次性传入8个unsigned int&…

Selenium 显式等待条件及其含义

等待条件含义title_is标题是某内容title_contains标题包含某内容presence_of_element_located节点加载出&#xff0c;传入定位元组&#xff0c;如 (By.ID, ‘p’)visibility_of_element_located节点可见&#xff0c;传入定位元组visibility_of可见&#xff0c;传入节点对象pres…

终于找到了:NuGet 修改包路径

NuGet 是 .NET 平台下的一个免费、开源的包管理开发工具。 修改全局包管理目录 通过 NuGet 安装包时&#xff0c;NuGet 先将包下载至一个统一的目录&#xff0c;默认路径是&#xff1a;C:Users用户名.nugetpackages 下载的包多了以后&#xff0c;会导致 C 盘空间被大量占用。…

REVERSE-COMPETITION-DSCTF-2022

REVERSE-COMPETITION-DSCTF-2022catchmeFFunctionnothingbad_applefantastic_cpucatchme 安卓逆向&#xff0c;java层传递输入&#xff0c;调用native层的check方法 ida打开.so文件&#xff0c;没有直接找到check方法&#xff0c;JNI_OnLoad也看不出什么 Findcrypt查到AES的S盒…

01-单一职责原则(SPR)

1. 背景 类T负责两个不同的职责&#xff1a;职责P1&#xff0c;职责P2。当由于职责P1需求发生改变而需要修改类T时&#xff0c;有可能会导致原本运行正常的职责P2功能发生故障。 2. 定义 不要存在多于一个导致类变更的原因。通俗的说&#xff0c;即一个类只负责一项职责。 3.…

Windows/Android/iOS 等常见 User-Agent 大全

User Agent 中文名为用户代理&#xff0c;简称 UA&#xff0c;是一个特殊字符串头&#xff0c;使得服务器能够识别客户使用的操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等。Python 爬虫通过伪装 UA 可以绕过某些检测。 以下为搜集的常见…

Python3 已经安装相关库,Pycharm 仍然报错 ModuleNotFoundError: No module named 'xxxxxx' 的解决办法

以 requests 库为例&#xff0c;打开 cmd&#xff0c;运行命令 pip install requests&#xff0c;即可安装 requests 库&#xff0c;由于我已经安装过&#xff0c;所以会提示 Requirement already satisfied 此时&#xff0c;我们使用 Pycharm 运行以下代码&#xff1a; impo…

Python3 爬虫学习笔记 C05 【Selenium + 无界面浏览器】

Python3 爬虫学习笔记第五章 —— 【Selenium 无界面浏览器】文章目录【5.1】关于无界面浏览器【5.2】PhantomJS【5.3】Headless Chrome【5.4】Headless Firefox【5.1】关于无界面浏览器 无界面&#xff08;headless&#xff09;浏览器&#xff0c;会把网站加载到内存并执行页…

Python3 爬虫学习笔记 C06 【正则表达式】

Python3 爬虫学习笔记第六章 —— 【正则表达式】文章目录【6.1】关于正则表达式【6.2】re.match() 方法【6.2.1】提取内容【6.2.2】通用匹配【6.2.3】贪婪匹配【6.2.4】非贪婪匹配【6.2.5】转义匹配【6.2.6】修饰符【6.3】re.search() 方法【6.4】re.findall() 方法【6.5】re.…

Sharepoint学习笔记—Site Definition系列-- 3、创建ListDefinition

创建一个List Definition有多条途径&#xff0c;这里由于我们要基于前面的用户自定义Content Type来创建一个List Defintion&#xff0c;所以我们就需要使用到List Definition From Content Type模板。 这里先大致描述如何创建List Definition&#xff0c;然后重点介绍一下Li…

Python3 爬虫学习笔记 C07 【解析库 lxml】

Python3 爬虫学习笔记第七章 —— 【解析库 lxml】文章目录【7.1】关于 lxml【7.2】使用 XPath【7.3】查找所有节点【7.4】查找子节点【7.5】查找父节点【7.6】属性匹配【7.7】文本获取【7.8】属性获取【7.9】一个属性包含多个值的匹配【7.10】多个属性匹配一个节点【7.11】按顺…

Sharepoint学习笔记—error处理-- The user does not exist or is not unique.

看到网上不少人遇到过这种类似的错误&#xff0c;而产生这种错误的原因也有多种&#xff0c;我产生此错误的背景是在试图通过ECMAscript对象模型把一个User添加到某个指定的Group中时遇到的。 问题1.当我试图把一个User添加到Sharepoint的某个指定的Group&#xff0c;…

Python3 爬虫学习笔记 C08【解析库 Beautiful Soup】

Python3 爬虫学习笔记第八章 —— 【解析库 Beautiful Soup】文章目录【8.1】关于 Beautiful Soup【8.2】Beautiful Soup 的基本使用【8.3】节点选择器【8.3.1】元素选择【8.3.2】提取信息【8.3.3】嵌套选择【8.3.4】关联选择【8.4】方法选择器【8.4.1】find_all() 方法【8.4.2…

Sharepoint学习笔记—Ribbon系列

为便于查阅&#xff0c;这里整理并列出了我的Sharepoint学习笔记中涉及Ribbon开发的关文章&#xff0c;有些内容可能会在以后更新。 Sharepoint学习笔记—Ribbon系列-- 1. Ribbon的架构 Sharepoint学习笔记—Ribbon系列-- 2. 在Ribbon中添加新Tab Sharepoint学习笔记—Ribbo…

Python3 爬虫学习笔记 C09【数据储存系列 — 文件储存】

Python3 爬虫学习笔记第九章 —— 【数据储存系列 — 文件储存】文章目录【9.1】TXT 文本存储【9.1.1】基本示例【9.1.2】打开方式【9.2】JSON 文件存储【9.2.1】对象和数组【9.2.2】读取 JSON【9.2.3】写入 JSON 文件【9.3】CSV 文本存储【9.3.1】写入【9.3.2】读取用解析器解…

Knockout学习笔记之二($root,$parent及$data的区别)

以下是我从Google上找到的一个例子&#xff0c;非常生动形象&#xff0c;我修改了部分代码&#xff0c;具体内容如下&#xff1a; 对于$root 与$parent的区别&#xff1a; $root refers to the view model applied to the DOM with ko.applyBindings;译&#xff1a;$root 是指…

GitHub 学生认证,申请 GitHub 学生包

GitHub 面对学生推出了学生认证服务&#xff0c;通过认证后就可以得到学生包&#xff0c;学生包大概有十几项优惠&#xff0c;包括 DATADOG Pro 帐户、免费两年的10台服务器&#xff0c;Icons8 3个月的带图标&#xff0c;照片&#xff0c;插图和音乐订阅服务、JETBRAINS 专业桌…

Sharepoint学习笔记—架构系列

为便于查阅&#xff0c;这里整理并列出了我的Sharepoint学习笔记中涉及架构方面的有关文章&#xff0c;有些内容可能会在以后更新。 Sharepoin学习笔记—架构系列-- Sharepoint的网页(Page)&#xff0c;网页解析(Parsing)与解析安全处理(Security) Sharepoin学习笔记 —架构…

Python3 使用 pymysql 连接 MySQL 建表时出现 Warning3719 UTF8 警告

在学习 Python3 爬虫关系型数据库储存时&#xff0c;利用 pymysql 连接 MySQL 建表&#xff0c;测试用的代码如下&#xff0c;第一句 SQL 用于获取当前 MySQL 的版本信息&#xff0c;第二句 SQL 执行创建 spiders 数据库的操作&#xff0c;如果程序代码正确&#xff0c;将会输出…

Sharepoin学习笔记—架构系列--01 Sharepoint的网页(Page),网页解析(Parsing)与解析安全处理(Security)

Microsoft SharePoint Foundation 中主要有两种类型的页面&#xff0c;分别是应用程序页(Application Page) 和网站页(Site Page)。 应用程序页(Application Page) 和网站页(Site Page)都从同一母版页继承其布局。 应用程序页(Application Page)与传统的 Microsoft ASP.NET 3.5…