Python爬虫学习日志(1)

记录自己在学习python爬虫过程中的一些笔记和遇到的问题

一些笔记

XML

一些特点

  1. 与HTML的区别

    • XML 被设计为传输和存储数据,其焦点是数据的内容。

    • HTML 被设计用来显示数据,其焦点是数据的外观。

  2. XML 文档中的元素形成了一棵文档树(节点树)

  3. 在 XML 中,省略关闭标签是非法的。

  4. XML 的属性值须加引号

  5. 在 XML 中,空格会被保留

  6. 对于属于数据的数据应使用子元素而不是属性。

    数据本身应当存储为元素,描述数据的数据才应当存储为属性

    因使用属性而引起的一些问题:

    • 属性无法包含多重的值(元素可以)
    • 属性无法描述树结构(元素可以)
    • 属性不易扩展
    • 属性难以阅读和维护

XPath

XPath 使用路径表达式来选取 XML 文档中的节点或者节点集。

表达式 描述
/ 路径从根节点开始,类似绝对路径
// 路径从匹配的节点开始,类似相对路径
. 当前节点。
当前节点的父节点。
@ 选取属性。
  1. 利用属性定位

    //tagname[ @attribute= "value"]

  2. 无属性利用层级关系定位

    //parrent[ @attribute= "value"]/tagname

  3. 同标签兄弟节点利用索引定位

    //library/module[1]
    //library/module[2]
    //library/module[3]
    
  4. contains函数模糊匹配

     //*[contains(@attribute,'arc')]
    # 找到所有属性attribute包含"arc"的节点
    

CSS选择器

一种模式,用于选择需要添加样式的元素。常用选择器如下:

  1. 类选择器

    是指可以被反复使用的一个CSS定义,一个标签可以指定多个类名,类名之间需要空格隔开。

    语法:.class

  2. id选择器

    id是标签的一种属性,具有唯一性

    语法:#id

  3. 标签选择器

    语法:tag

  4. 属性选择器

    • [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还有其他一些方法,如下

  1. switch_to.parent_frame()
  2. switch_to.default_content()
  3. switch_to.alert()*

你可能感兴趣的:(python,爬虫)