网络爬虫(二)——Xpath和Selenium的使用

文章目录

  • 2 网络爬虫进阶
    • 2.1 Xpath
      • 2.1.1 Xpath解析原理
      • 2.1.2 信息提取
        • 2.1.2.1 获取所有结点
        • 2.1.2.2 获取子节点
        • 2.1.2.3 获取父节点
        • 2.1.2.4 获取文本
      • 2.1.3 属性匹配
        • 2.1.3.1 单个属性匹配
        • 2.1.3.2 多个属性匹配
    • 3.1 Selenium
      • 3.1.1 概述
      • 3.1.2 安装
      • 3.1.3 元素定位
      • 3.1.4 元素信息
      • 3.1.5 交互
      • 3.1.6 Chrome handless

2 网络爬虫进阶

2.1 Xpath

虽然正则表达式处理字符串的能力很强,但是在编写正则表达式的时候代码还是比较麻烦的,如果不小心写错一处,那么将无法匹配页面中所需要的数据,因为网页中包含大量的节点,而节点中又包含id、class等属性。如果在解析页面中的数据时,通过Xpath来定位网页中的数据,将会更加简单有效。

相比于bs4,Xpath功能更加强大,不仅提供非常简洁明了的路径选择表达式,还提供了超过 100 个内建函数,用于字符串、数值、时间比较、序列处理、逻辑值等,几乎所有定位的节点都可以用 Xpath 来选择。

2.1.1 Xpath解析原理

在使用Xpath解析时,我们首先要做的是导入etree模块,且需要使用etree下的方法将被解析的页面源码数据加载到etree对象中。在实例化完成后,我们可以调用etree对象中的xpath方法结合xpath表达式实现标签的定位和内容的捕获。

这里需要注意的是,etree模块是在lxml包下的模块,导入方式为:

from lxml import etree

如何将HTML数据加载到etree模块中?

  • 如果是本地的html文档,那么通过etree.parse(filepath)方法可以将源码数据加载到etree对象中。
  • 如果是互联网的源码数据,则使用etree.HTML(‘page_text’),其可以将源码数据加载到etree对象中。

2.1.2 信息提取

当将解析后的HTML页面加载到etree对象后,想要获取某个标签的信息,就需要用到定位。

2.1.2.1 获取所有结点

如果不加筛选,想要获取所有信息,则xpath方法中的表达式只需填入//*即可。

from lxml import etreeTesthtml = """<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>心得体会——尘鱼</title>
</head>
<body><h1>浮世三千</h1><hr><h2>文章内容</h2><p>无非两种人:一种是做了,没成功,所以焦虑;一种是没做,要迎接失败了,所以焦虑。人常常会把自己的所得经验告诫未得之人,就如同许久之前高中的恩师一般念叨;人常常会抱怨世间的不公,想要改变眼前的一切;而人在经历了大起大落后回望,他们总是能发现:自己的付出不像童话里的那般美好,总能得到意外的对待。很少有些许的沉思,或者来自内心深处的拷问:自己至此,该干什么,身边的人说了那么多,自己该不该反思什么。致命的慵懒总是带来成堆的接口,漫天的抱怨似乎幽怨的黑洞,似乎解决的方法就像是时光隧道中那一丝薄弱的亮光微不可及;避开自己心里的拷问,避开一切的一切,似乎拖着拖着生活的美好就能如期而至。</p><img src="https://images.cnblogs.com/cnblogs_com/blogs/710924/galleries/2086847/o_220115052557_5af17f7f881b11ebb6edd017c2d2eca2.jpg" alt="图片加载失败" title="该图片来源于尘鱼好美" weight="480" height="360"><p>“日常所得焦虑,无非是三天打鱼两天晒网,时而努力时而颓废所致。”</p><p>约莫些许人同此言,却又忘却其 “人生的悲欢并不相同,他们只觉得你吵闹。<br>弃浮沉往事,探前方长路坎坷;弃勿须情感,奔自己心中所想。<br>繁琐的慥词现已无人愿细细品味,只愿将心中所得能与伯乐共享,足矣。</p>如果喜欢该案例可以关注我的网站<br><a href="https://www.cnblogs.com/ChengYuHaoMei/">点此前往</a><audio src="https://audio04.dmhmusic.com/71_53_T10051752137_128_4_4_0_sdk-cpm/cn/0103/M00/10/B5/ChR45F8hdhCAJ_unAAdXW5beNxE239.mp3?xcode=e20e7d6d765a63dc97d12357a8578f3cc746bc4" controls autoplay loop>
</body>
</html>
"""tree = etree.HTML(Testhtml)
nodeall = tree.xpath("//*")
print("数据内容:", nodeall)

out:

image-20220501101853137

/和//的不同

/表示的是从根节点开始定位,表示的是一个层级。

//表示的是多个层级,可以表示从任意位置开始定位

比如说想要获取所有p标签,则无需从body开始,直接//p即可。

2.1.2.2 获取子节点

如果想要获取一个节点中的子节点,则使用/可以实现定位,如想要定位html标签下的head标签下的div标签,则可以写成

//html/head/div

我们试一下敲一下下面的代码:

from lxml import etreeTesthtml = """<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>心得体会——尘鱼</title>
</head>
<body><h1>浮世三千</h1><hr><h2>文章内容</h2><p>无非两种人:一种是做了,没成功,所以焦虑;一种是没做,要迎接失败了,所以焦虑。人常常会把自己的所得经验告诫未得之人,就如同许久之前高中的恩师一般念叨;人常常会抱怨世间的不公,想要改变眼前的一切;而人在经历了大起大落后回望,他们总是能发现:自己的付出不像童话里的那般美好,总能得到意外的对待。很少有些许的沉思,或者来自内心深处的拷问:自己至此,该干什么,身边的人说了那么多,自己该不该反思什么。致命的慵懒总是带来成堆的接口,漫天的抱怨似乎幽怨的黑洞,似乎解决的方法就像是时光隧道中那一丝薄弱的亮光微不可及;避开自己心里的拷问,避开一切的一切,似乎拖着拖着生活的美好就能如期而至。</p><img src="https://images.cnblogs.com/cnblogs_com/blogs/710924/galleries/2086847/o_220115052557_5af17f7f881b11ebb6edd017c2d2eca2.jpg" alt="图片加载失败" title="该图片来源于尘鱼好美" weight="480" height="360"><p>“日常所得焦虑,无非是三天打鱼两天晒网,时而努力时而颓废所致。”</p><p>约莫些许人同此言,却又忘却其 “人生的悲欢并不相同,他们只觉得你吵闹。<br>弃浮沉往事,探前方长路坎坷;弃勿须情感,奔自己心中所想。<br>繁琐的慥词现已无人愿细细品味,只愿将心中所得能与伯乐共享,足矣。</p>如果喜欢该案例可以关注我的网站<br><a href="https://www.cnblogs.com/ChengYuHaoMei/">点此前往</a><audio src="https://audio04.dmhmusic.com/71_53_T10051752137_128_4_4_0_sdk-cpm/cn/0103/M00/10/B5/ChR45F8hdhCAJ_unAAdXW5beNxE239.mp3?xcode=e20e7d6d765a63dc97d12357a8578f3cc746bc4" controls autoplay loop>
</body>
</html>
"""tree = etree.HTML(Testhtml)
imgnode = tree.xpath("//body/img")
print("数据内容:", imgnode)

out:

image-20220501102516884

2.1.2.3 获取父节点

有时候从最外面的标签一步一步走里面可能会比较麻烦,从里面的标签一步一步走外面也不失为一种较好的方法。当我们想要获取一个节点的父节点时,可以使用..来实现。

from lxml import etreeTesthtml = """<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>心得体会——尘鱼</title>
</head>
<body><h1>浮世三千</h1><hr><h2>文章内容</h2><p>无非两种人:一种是做了,没成功,所以焦虑;一种是没做,要迎接失败了,所以焦虑。人常常会把自己的所得经验告诫未得之人,就如同许久之前高中的恩师一般念叨;人常常会抱怨世间的不公,想要改变眼前的一切;而人在经历了大起大落后回望,他们总是能发现:自己的付出不像童话里的那般美好,总能得到意外的对待。很少有些许的沉思,或者来自内心深处的拷问:自己至此,该干什么,身边的人说了那么多,自己该不该反思什么。致命的慵懒总是带来成堆的接口,漫天的抱怨似乎幽怨的黑洞,似乎解决的方法就像是时光隧道中那一丝薄弱的亮光微不可及;避开自己心里的拷问,避开一切的一切,似乎拖着拖着生活的美好就能如期而至。</p><img src="https://images.cnblogs.com/cnblogs_com/blogs/710924/galleries/2086847/o_220115052557_5af17f7f881b11ebb6edd017c2d2eca2.jpg" alt="图片加载失败" title="该图片来源于尘鱼好美" weight="480" height="360"><p>“日常所得焦虑,无非是三天打鱼两天晒网,时而努力时而颓废所致。”</p><p>约莫些许人同此言,却又忘却其 “人生的悲欢并不相同,他们只觉得你吵闹。<br>弃浮沉往事,探前方长路坎坷;弃勿须情感,奔自己心中所想。<br>繁琐的慥词现已无人愿细细品味,只愿将心中所得能与伯乐共享,足矣。</p>如果喜欢该案例可以关注我的网站<br><a href="https://www.cnblogs.com/ChengYuHaoMei/">点此前往</a><audio src="https://audio04.dmhmusic.com/71_53_T10051752137_128_4_4_0_sdk-cpm/cn/0103/M00/10/B5/ChR45F8hdhCAJ_unAAdXW5beNxE239.mp3?xcode=e20e7d6d765a63dc97d12357a8578f3cc746bc4" controls autoplay loop>
</body>
</html>
"""tree = etree.HTML(Testhtml)
imgnode = tree.xpath("//img/..")
print("数据内容:", imgnode)

out:

image-20220501103345351

2.1.2.4 获取文本

如果想要使用XPath获取HTML代码中的文本时,可以使用text()方法。

敲一下下面的代码,体会上述的话。

from lxml import etreeTesthtml = """<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>心得体会——尘鱼</title>
</head>
<body><h1>浮世三千</h1><hr><h2>文章内容</h2><p>无非两种人:一种是做了,没成功,所以焦虑;一种是没做,要迎接失败了,所以焦虑。人常常会把自己的所得经验告诫未得之人,就如同许久之前高中的恩师一般念叨;人常常会抱怨世间的不公,想要改变眼前的一切;而人在经历了大起大落后回望,他们总是能发现:自己的付出不像童话里的那般美好,总能得到意外的对待。很少有些许的沉思,或者来自内心深处的拷问:自己至此,该干什么,身边的人说了那么多,自己该不该反思什么。致命的慵懒总是带来成堆的接口,漫天的抱怨似乎幽怨的黑洞,似乎解决的方法就像是时光隧道中那一丝薄弱的亮光微不可及;避开自己心里的拷问,避开一切的一切,似乎拖着拖着生活的美好就能如期而至。</p><img src="https://images.cnblogs.com/cnblogs_com/blogs/710924/galleries/2086847/o_220115052557_5af17f7f881b11ebb6edd017c2d2eca2.jpg" alt="图片加载失败" title="该图片来源于尘鱼好美" weight="480" height="360"><p>“日常所得焦虑,无非是三天打鱼两天晒网,时而努力时而颓废所致。”</p><p>约莫些许人同此言,却又忘却其 “人生的悲欢并不相同,他们只觉得你吵闹。<br>弃浮沉往事,探前方长路坎坷;弃勿须情感,奔自己心中所想。<br>繁琐的慥词现已无人愿细细品味,只愿将心中所得能与伯乐共享,足矣。</p>如果喜欢该案例可以关注我的网站<br><a href="https://www.cnblogs.com/ChengYuHaoMei/">点此前往</a><audio src="https://audio04.dmhmusic.com/71_53_T10051752137_128_4_4_0_sdk-cpm/cn/0103/M00/10/B5/ChR45F8hdhCAJ_unAAdXW5beNxE239.mp3?xcode=e20e7d6d765a63dc97d12357a8578f3cc746bc4" controls autoplay loop>
</body>
</html>
"""tree = etree.HTML(Testhtml)
TextNode = tree.xpath("//body/p/text()")
print("数据内容:", TextNode)

out:

image-20220501103653202

2.1.3 属性匹配

2.1.3.1 单个属性匹配

如果想要获取通过标签中的属性来进行匹配,可以使用[@标签属性]来进行匹配。

敲一下下面的代码,体会这里所讲的知识点。

from lxml import etreeTesthtml = """<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><div><h1>《自然》评选改变科学的10个计算机代码项目</h1><div class="top"><span id = "time">2077年01月28号日14:58</span> <span id = "source">新浪科技 </span>     <a href="#">收藏本文</a><hr><p class="text">北京时间 1 月 26 日消息,据国外媒体报道,从 Fortran 到 arXiv.org,这些计算机编码和平台让生物学、气候科学和物理学等学科的发展达到了真正 “日新月异”的速度。</p><p class = "text">2019 年,事件视界望远镜团队让世界首次看到了黑洞的样子。不过,研究人员公布的这张发光环形物体的图像并不是传统的图片,而是经过计算获得的。利用位于美国、墨西哥、智利、西班牙和南极地区的射电望远镜所得到的数据,研究人员进行了数学转换,最终合成了这张标志性的图片。研究团队还发布了实现这一壮举所用的编程代码,并撰文记录这一发现,其他研究者也可以在此基础上进一步加以分析。</p></div></div>
</body>
</html>"""tree = etree.HTML(Testhtml)
TextNode = tree.xpath("//span[@id ='time']")
print("数据内容:", TextNode)

out:

image-20220501104623878

2.1.3.2 多个属性匹配

如果你匹配的标签上面有多个属性,那么你可以通过@[属性1 and 属性2]来实现更加精确的定位,这个很简单,自己试试即可,这里不过多赘述。

3.1 Selenium

3.1.1 概述

Selenium是一个用于web应用程序测试的工具,其测试直接运行在浏览器中,就像真正的用户在操作一样。

Selenium还支持各种驱动,如IE驱动,谷歌驱动,火狐驱动等等,驱动真实浏览器完成测试。当然,其也支持无界面浏览器操作。

使用selenium可以达到真实打开浏览器操作的效果,还能使得网页中的js代码自动执行,实现动态加载。

3.1.2 安装

由于edge近年来给程序员的体验不错,故这里采用我使用edge而不是谷歌。

edge安装官方有详细介绍,这里不过多赘述。详见使用 WebDriver 自动执行 Microsoft Edge - Microsoft Edge Development | Microsoft Docs

如果看不懂也可以在这个博主里面学着安装(1条消息) Selenium驱动Edge浏览器_snrxian的博客-CSDN博客_edge selenium驱动

安装完成后试着打开一个py文件输出下面的代码运行一下。

from selenium import webdriver//创建驱动对象
browser = webdriver.Edge()
browser.get('https://www.baidu.com')
browser.quit()

如果可以让脚本自己打开一个浏览器就安装成功了。

如果你想要返回浏览器打开页面后加载的源码,可以使用其驱动对象.page_source属性,可以返回源码。

3.1.3 元素定位

Selenium可以自动化模拟鼠标和键盘来操作这些元素,点击、输入等。而操作这些元素前需要先找到它们,WebDriver提供很多定位元素的方法。

方法 解释 find_element_by_class_name() 通过节点的 class 属性值定位 find_element_by_name() 通过节点的 name 属性名定位 find_element_by_id() 通过节点的 id 属性值定位 find_element_by_link_text() 通过超链接节点的文本定位 find_element_by_partial_link_text() 通过超链接节点包含的部分文本定位 find_element_by_tag_name() 通过节点名定位 find_element_by_xpath() 通过 Xpath 语法定位 find_element_by_css_selector() 通过 CSS 选择器定位

实际上,在以前老版本中find_element_by_[标签] ()可以用于查找对应的web表单组件,但是现在统一被归结为find_element("标签","标签值")

如果你还是听不懂,可以试着敲一下下面的代码,体会我说的意思。

from selenium import webdriver# 1 创建对象
browser = webdriver.Edge()# 2 获取网页
url = "https://www.baidu.com/"
browser.get(url)# 3 元素定位
button = browser.find_element("id", "su")
print(button)

甚至于你前面学过了Xpath,你还可以使用find_element_by_xpath(“xpath表达式”)来进行定位。

如果你要获取多个表单组件,可以使用find_elements(“标签”,“标签值”),这里就不一一介绍了,在自己的脚本中改一改试一试就能懂了。

3.1.4 元素信息

如果想要获取某个表单组件的属性值,可以使用get_attribute(属性值)方法。演示如下:

from selenium import webdriver# 1 创建对象
browser = webdriver.Edge()# 2 获取网页
url = "https://www.baidu.com/"
browser.get(url)button1 = browser.find_element_by_id("su")print(button1.get_attribute("class"))

out:

image-20220503191946839

如果想要获取标签名,则可以使用tag_name()方法。

如果想要获取元素文本,则可以使用text()方法。这里需要稍加说明,元素文本指的是开始标签和结束标签中间夹着的文本。

3.1.5 交互

Selenium允许对Web页面进行简单的交互,如点击、滑动鼠标、前进、后退等操作。其适用于爬取一些滑到底部才能加载下一页的一些页面。

这里的知识点我也不做讲解,试着敲一下下面的脚本,你可以体会到点击、文本框输出、滑动页面等诸多操作。

from selenium import webdriver
import time# 1 创建对象
browser = webdriver.Edge()# 2 获取网页
url = "https://www.baidu.com/"
browser.get(url)# 3 睡眠几秒
time.sleep(2)# 4 获取文本框对象
input = browser.find_element("id", "kw")
time.sleep(2)# 输入文本“周杰伦”
input.send_keys("周杰伦")
time.sleep(2)# 5 获取百度一下的按钮
button = browser.find_element("id", "su")# 6 点击百度一下按钮
button.click()
time.sleep(2)# 7 滑到底部
js_bottom = 'document.documentElement.scrollTop = 100000'
browser.execute_script(js_bottom)
time.sleep(2)# 8 获取下一页按钮
next = browser.find_element("xpath", "//a[@class = 'n']")# 9 点击下一页
next.click()
time.sleep(2)# 10 回到上一页
browser.back()
time.sleep(2)# 11 回去
browser.forward()
time.sleep(3)# 12 退出
browser.quit()

3.1.6 Chrome handless

Chrome-headless模式是Google针对其浏览器59版新增加的一种模式,可以让你在不打开UI界面的情况下使用Chrome浏览器,这无疑为Selenium的使用提高了运行速度。

由于我使用的是Edge浏览器,爬的东西一般也不多,所以关于这部分我就不细讲了,如果有需要的,自己查个博客学一学,很简单的,加油!

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

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

相关文章

hdu-1176(dp)

解题思路&#xff1a;用dp做的&#xff0c;dp[i][j]表示在i时刻&#xff0c;j点的最大馅饼。a[i][j]表示在i这个时刻j点同时掉落的馅饼&#xff1b; 每个点除了0和10之外&#xff0c;都有三种状态&#xff1b; 1、没有移动&#xff0c;这样值就为dp[i][j]max(dp[i][j],dp[i-1][…

lintcode:买卖股票的最佳时机 III

买卖股票的最佳时机 III 假设你有一个数组&#xff0c;它的第i个元素是一支给定的股票在第i天的价格。设计一个算法来找到最大的利润。你最多可以完成两笔交易。 样例 给出一个样例数组 [4,4,6,1,1,4,2,5], 返回 6 解题 尝试参考买卖股票的最佳时机 II 提交运行发现错误&#…

session 学习

Session模型简介Session 是什么呢&#xff1f;简单来说就是服务器给客户端的一个编号。当一台WWW服务器运行时&#xff0c;可能有若干个用户浏览正在运正在这台服务器上的网站。当每个用户首次与这台 WWW服务器建立连接时&#xff0c;他就与这个服务器建立了一个Session&#x…

julia学习笔记(二)——基本数据类型

文章目录2 数据类型2.1 整数2.2 浮点数2.3 机器精度2.4 舍入模式2.5 数值字面量系数2.6 零和一的字面量2 数据类型 2.1 整数 如果想要在julia中输入整数字面值。如下&#xff1a; julia> 34 7至于你的整数字面值默认是什么数据类型&#xff0c;这取决于目标系统是32位还是…

微信(支付宝)小程序蓝牙4.0线上项目

需求 &#xff1a; 微信(支付宝)小程序链接BLE4.0 &#xff0c;发送指令到蓝牙硬件过程 &#xff1a; 小程序分为安卓和ios两套系统&#xff0c;支持连接BLE 蓝牙 &#xff0c;其中会遇到机型问题&#xff08;其中安卓&#xff0c;华为荣耀机型&#xff0c;小米&#xff0c;问题…

团队项目计划BACKLOG

团队名称&#xff1a; 铁大老司机 团队成员&#xff1a; 组长&#xff1a;杨超群 组员&#xff1a;杨涛 杜文星 张家军 计划会议过程&#xff1a; 我们小组在周三下午进行了团队会议&#xff0c;会议召开在图书馆大厅&#xff0c;主要内容是进行项目的总体计划安排&#xff0…

pyc文件

学习自&#xff1a;http://blog.csdn.net/sislcb/article/details/4002414 Python解释器:源代码-->字节码-->机器语言不同版本编译后的pyc文件是不同的python提供了内置库文件来实现将python编译成pyc文件。 import py_compile py_compile.compile(rH:/game/test.py) pyc…

C++从0到1的入门级教学(八)——通讯录管理系统

文章目录8 通讯录管理系统8.1 系统需求8.2 菜单功能8.3 退出功能8.4 添加联系人8.4.1 设计联系人结构体8.4.2 设计通讯录结构体8.4.3 main函数中创建通讯录8.4.4 封装添加联系人函数8.5 显示联系人8.5.1 封装显示联系人函数8.5.2 调用显示联系人函数8.6 删除联系人8.6.1 封装检…

【Data Cluster】真机环境下MySQL数据库集群搭建

真机环境下MySQL-Cluster搭建文档 MySQL Cluster简介 MySQL cluster 和 Oracle RAC 完全不同&#xff0c;它采用 无共享架构Shared nothing&#xff08;shared nothing architecture&#xff09;。整个集群由管理节点(ndb_mgmd)&#xff0c;处理节点(mysqld)和存储节点(ndbd)组…

【层次聚类】python scipy实现

层次聚类 原理 有一个讲得很清楚的博客&#xff1a;博客地址 主要用于&#xff1a;没有groundtruth&#xff0c;且不知道要分几类的情况 用scipy模块实现聚类 参考函数说明&#xff1a;pdistsquareformlinkagefcluster scipy.spatial.distance.pdist&#xff1a;计算点之间的距…

Find a girl friend

Find a girl friend Time Limit: 1000ms Memory limit: 262144K 有疑问&#xff1f;点这里^_^ 题目描述 CC wants to find a girl friend, he knows each girls age and name in his class, and each girl’s age is different.. Now he wants to know the youngest girls n…

数据结构杂谈(八)——树(上)

文章目录8 树(上)8.1 引入8.2 树的基础知识8.3 树的存储结构8.3.1 双亲表示法8.3.2 孩子表示法8.4 二叉树8.4.1 基础知识8.4.2 高频考点8.4.3 二叉树的性质8.4.4 二叉链表8.4.5 树和二叉树的转换8.4.6 森林和二叉树的转换8.5 遍历8 树(上) 8.1 引入 我们在前面的章节中一直在…

vs entityframwork Validation failed for one or more entities

问题&#xff1a;添加数据库一条数据时出错 查找异常 catch (DbEntityValidationException dbEx) { foreach (var validationErrors in dbEx.EntityValidationErrors) { foreach (var validationError in validationErrors.ValidationErrors) { Trace.TraceInformation("P…

Universal-Image-Loader,android-Volley,Picasso、Fresco和Glide开源组件加载网络图片的优缺点比较...

在android中的加载网络图片是一件十分令人头疼的事情&#xff0c;在网上有着许多关于加载网络图片的开源库&#xff0c;可以让我们十分方便的加载网络图片。在这里我主要介绍一下我自己在使用Volley, Picasso, Universal-Imageloader的一些使用的感悟。以及最基本的用法介绍。1…

hdu 1754 I Hate It(分块做法)

题意&#xff1a;中文题&#xff0c;不多解释 思路&#xff1a;这个题原本用线段树很容易做&#xff0c;但分块其实也很容易&#xff0c;对于分块的复杂度还不是很会计算&#xff0c;只知道是每次分为sqrt&#xff08;n&#xff09;块&#xff0c;然后一共有sqrt&#xff08;n&…

Maven(一)——快速上手Maven

文章目录Maven概述Maven简介Maven的安装Maven的基本使用IDEA配置Maven依赖管理依赖范围Maven概述 Maven是专门用于管理和构建Java项目的工具&#xff0c;它的主要功能有&#xff1a; &#xff08;一&#xff09;提供了一套标准化的项目结构 不同的IDE项目结构是不一样的&…

如何定制Activity的标题栏

requestWindowFeature(Window.FEATURE_CUSTOM_TITLE); setContentView(R.layout.main); //自定义标题栏 mWindow getWindow(); mWindow.setFeatureInt(Window.FEATURE_CUSTOM_TITLE,R.layout.titlebar); titlebar.xml <?xml version"1.…

牛客网 牛客小白月赛1 H.写真がとどいています

H.写真がとどいています链接&#xff1a;https://www.nowcoder.com/acm/contest/85/H来源&#xff1a;牛客网这个题数乱了&#xff0c;导致wa了好几次。特别弱智&#xff0c;从A开始往上&#xff0c;就是A,B,C,D,E,F。A的下面就是G开始倒着&#xff0c;G,F,E。我智障&#xff0…

EntityFramework_MVC4中EF5 新手入门教程之三 ---3.排序、 筛选和分页

在前面的教程你实施了一套基本的 CRUD 操作&#xff0c;为Student实体的 web 页。在本教程中&#xff0c;您将添加排序、 筛选和分页到 StudentsIndex的功能。您还将创建一个页面&#xff0c;并简单分组。 下面的插图显示页面当你完成时的样子。列标题是链接&#xff0c;用户可…

eclipes快捷键

本文原创作者&#xff1a;pipi-changing 本文原创出处&#xff1a;http://www.cnblogs.com/pipi-changing/ Ctrl1 快速修复(最经典的快捷键,就不用多说了)CtrlD: 删除当前行 CtrlAlt↓ 复制当前行到下一行(复制增加)CtrlAlt↑ 复制当前行到上一行(复制增加)Alt↓ 当前行和下面一…