Python爬虫学习日志(1)
记录自己在学习python爬虫过程中的一些笔记和遇到的问题
一些笔记
XML
一些特点
-
与HTML的区别
-
XML 被设计为传输和存储数据,其焦点是数据的内容。
-
HTML 被设计用来显示数据,其焦点是数据的外观。
-
-
XML 文档中的元素形成了一棵文档树(节点树)。
-
在 XML 中,省略关闭标签是非法的。
-
XML 的属性值须加引号
-
在 XML 中,空格会被保留
-
对于属于数据的数据应使用子元素而不是属性。
数据本身应当存储为元素,描述数据的数据才应当存储为属性
因使用属性而引起的一些问题:
- 属性无法包含多重的值(元素可以)
- 属性无法描述树结构(元素可以)
- 属性不易扩展
- 属性难以阅读和维护
XPath
XPath 使用路径表达式来选取 XML 文档中的节点或者节点集。
| 表达式 | 描述 |
|---|---|
| / | 路径从根节点开始,类似绝对路径 |
| // | 路径从匹配的节点开始,类似相对路径 |
| . | 当前节点。 |
| … | 当前节点的父节点。 |
| @ | 选取属性。 |
-
利用属性定位
//tagname[ @attribute= "value"] -
无属性利用层级关系定位
//parrent[ @attribute= "value"]/tagname -
同标签兄弟节点利用索引定位
//library/module[1] //library/module[2] //library/module[3] -
contains函数模糊匹配
//*[contains(@attribute,'arc')] # 找到所有属性attribute包含"arc"的节点
CSS选择器
一种模式,用于选择需要添加样式的元素。常用选择器如下:
-
类选择器
类是指可以被反复使用的一个CSS定义,一个标签可以指定多个类名,类名之间需要空格隔开。
语法:
.class -
id选择器
id是标签的一种属性,具有唯一性
语法:
#id -
标签选择器
语法:
tag -
属性选择器
[attribute=value]属性值等于value[attribute~=value]属性值中包含独立的单词value[attribute*=value]属性值中做字符串拆分可拆出value[attribute|=value]属性值必须以value开头且必须是完整且唯一的单词,或者以 - 分隔开[attribute$=value]属性值的结尾是value,常用于匹配文件后缀名
一些问题
Q1: json.dumps()中文被序列化为Unicode编码
Solution: 使用该方法时补充参数ensure_ascii=False
import json
with open('text.txt', 'w',encoding='utf8') as f:f.write(json.dumps({'name':'朱丹清'})+'\n')f.write(json.dumps({'name':'朱丹清'},ensure_ascii=False))
with open('text.txt', 'r',encoding='utf8') as f:print(f.read())
# output:
# {"name": "\u6731\u4e39\u6e05"}
# {"name": "朱丹清"}
Q2: webdriver.save_screenshot不能截取网页全部内容
Solution: 使用Chrome的无界面模式,执行JS获取网页长宽,设置为Chrome窗口大小
options = webdriver.ChromeOptions()
options.add_argument('--headless')
browser = webdriver.Chrome(chrome_options=options)width = browser.execute_script("return Math.max(document.body.scrollWidth, document.body.offsetWidth, document.documentElement.clientWidth, document.documentElement.scrollWidth, document.documentElement.offsetWidth);")
height = browser.execute_script("return Math.max(document.body.scrollHeight, document.body.offsetHeight, document.documentElement.clientHeight, document.documentElement.scrollHeight, document.documentElement.offsetHeight);")
browser.set_window_size(width, height)
Q3: 漏加匹配模式修饰符
常用的两个
| 修饰符 | 描述 | 应用 |
|---|---|---|
re.S | 使.能匹配换行符 | .*?能跨行非贪婪匹配任意字符 |
re.I | 使匹配对大小写不敏感 | 如描述 |
Q4: WebDriver找不到元素
Solution: 需要通过switch_to.frame()方法来切换到元素所在的frame
语法:switch_to.frame(reference)
reference是用来定位frame参数,可以用id、name、index以及更强大的selenium的WebElement对象(用find_element系列方法取得)
switch_to还有其他一些方法,如下
switch_to.parent_frame()switch_to.default_content()switch_to.alert()*
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
