记录自己在学习python爬虫过程中的一些笔记和遇到的问题
与HTML的区别
XML 被设计为传输和存储数据,其焦点是数据的内容。
HTML 被设计用来显示数据,其焦点是数据的外观。
XML 文档中的元素形成了一棵文档树(节点树)。
在 XML 中,省略关闭标签是非法的。
XML 的属性值须加引号
在 XML 中,空格会被保留
对于属于数据的数据应使用子元素而不是属性。
数据本身应当存储为元素,描述数据的数据才应当存储为属性
因使用属性而引起的一些问题:
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定义,一个标签可以指定多个类名,类名之间需要空格隔开。
语法:.class
id选择器
id是标签的一种属性,具有唯一性
语法:#id
标签选择器
语法:tag
属性选择器
[attribute=value]
属性值等于value[attribute~=value]
属性值中包含独立的单词value[attribute*=value]
属性值中做字符串拆分可拆出value[attribute|=value]
属性值必须以value开头且必须是完整且唯一的单词,或者以 - 分隔开[attribute$=value]
属性值的结尾是value,常用于匹配文件后缀名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": "朱丹清"}
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)
常用的两个
修饰符 | 描述 | 应用 |
---|---|---|
re.S |
使. 能匹配换行符 |
.*? 能跨行非贪婪匹配任意字符 |
re.I |
使匹配对大小写不敏感 | 如描述 |
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()*