Python 爬虫(一)

CSS-选择器
- 元素选择器
直接选择文档元素
如head,p

  • 类选择器
    元素的class属性,如<h1 class = "important">
    .important 选择所有有这个类属性的元素
    可以结合元素选择器,如p.important

  • id选择器
    与类选择器类似
    与类选择器的区别:ID一个文档只能出现一次,ID选择器不能使用单词列表

  • 属性选择器
    选择有某个属性的元素,不论值是什么
    *[title]选择所有包含title属性的元素
    a[href]选择所有带有href属性的锚元素
    a[href][title]选择所有同时带有此两种属性的元素
    限定值:a[href=”www.58weiyuan.cn”]

  • 后代(包含)选择器
    选择某元素后代的元素(层级不受限制)
    选择h1元素的em元素 : h1 em

  • 子元素选择器
    范围限制在子元素
    选择h1元素的子元素strong:h1>strong

XPath-简介

  • Xpath-节点
    七种基本节点:元素,属性,文本,命名空间,处理指令,注释以及根节点
    节点之间的关系:父、子、同胞(兄弟)、先辈、后代

  • Xpath-语法
    路径表达式:
    nodename选取此节点的所有子节点
    /从根节点选取
    //从匹配的当前节点选择文档中的节点,而不考虑他们的位置
    .选取当前节点
    ..选取当前节点的父节点
    @选取属性
    例子:

    下为xml代码

<?xml version="1.0" encoding="ISO-8859-1"?>
<bookstore>
    <book>
        <title lang="eng">Harry Potter</title>
        <price>29.99</price>
    </book>
    <book>
        <title lang="eng">Learning XML</title>
        <price>39.95</price>
    </book>
</bookstore>
    bookstore选取bookstore元素的所有子节点
    /bookstore选取根元素bookstore
    /bookstore/book选取属于bookstore的子元素的所有book元素
    //book选取所有book元素,而不管他们在文档中的位置
    bookstore//book选择属于bookstore元素的后代的所有book元素
    //@lang选取名为lang的所有属性
谓语:
        嵌在[]中用来查找某个特定节点或包含某个指定值的节点。
        /bookstore/book[1]第一个book元素
        /bookstore/book[last()]最后一个book元素
        /bookstore/book[position()<3]选择前2 //title[@lang]选择所拥有名为lang的属性的title元素
        /bookstore/book[price>35.0]

(可以下载JQuery,用XPath来处理,练习操作)

与CSS比较
CSS更加简洁,而XPath选择功能更加强大,重点在于层级切换

Json(JavaScript Object Notation)
类似XML,但是比XML更小、更快,更易解析,使用json库处理json,编码与解码

import json
obj = {'one':1, 'two':2, 'three':[1,2,3]}
encoded = json.dumps(obj)
print(encoded)
print(type(encoded))

decoded = json.loads(encoded)
print(type(decoded))
print(decoded)
{"one": 1, "two": 2, "three": [1, 2, 3]}
<class 'str'>

<class 'dict'>
{'one': 1, 'two': 2, 'three': [1, 2, 3]}

Python处理XML方法
DOM把整个XML读入内存,解析为树,因此占用内存大,解析慢,优点是可以任意遍历树的节点。
而SAX流模式,边读边解析,占用内存小,解析快,缺点是需要自己处理事件。
- DOM模式:

以下为xml代码
<?xml version="1.0" encoding="ISO-8859-1"?>
<bookstore>
    <book>
        <title lang="eng">Harry Potter</title>
        <price>29.99</price>
    </book>
    <book>
        <title lang="eng">Learning XML</title>
        <price>39.95</price>
    </book>
</bookstore>
from xml.dom import minidom

doc = minidom.parse('book.xml')
root = doc.documentElement
print(type(root))
# print(dir(root))
print(root.nodeName)


输出:
<class 'xml.dom.minidom.Element'>
bookstore
用DOM方式提取XML中的内容:
from xml.dom import minidom
doc = minidom.parse('book.xml')
root = doc.documentElement
books = root.getElementsByTagName('book')
for book in books:
    titles = book.getElementsByTagName('title')
    prices = book.getElementsByTagName('price')
    title = titles[0].childNodes[0].nodeValue
    price = prices[0].childNodes[0].nodeValue
    print(title, price)

输出:
Harry Potter 29.99
Learning XML 39.95
  • SAX流模式
    XML代码同上
import string
from xml.parsers.expat import ParserCreate

class DefaultSaxHandler(object):
    def start_element(self, name, attrs):
        self.name = name
        print('element: %s, attrs: %s'%(name, str(attrs)))

    def end_element(self, name):
        print('end element: %s' %name)

    def char_data(self, text):
        if text.strip():
            print("%s's text is %s"%(self.name, text))

handler = DefaultSaxHandler()
parser = ParserCreate()
parser.StartElementHandler = handler.start_element # <book>
parser.EndElementHandler = handler.end_element  # </book>
parser.CharacterDataHandler = handler.char_data # <title>character data </title>

with open('book.xml', 'r') as f:
    parser.Parse(f.read())
输出:
element: bookstore, attrs: {}
element: book, attrs: {}
element: title, attrs: {'lang': 'eng'}
title's text is Harry Potter
end element: title
element: price, attrs: {}
price's text is 29.99
end element: price
end element: book
element: book, attrs: {}
element: title, attrs: {'lang': 'eng'}
title's text is Learning XML
end element: title
element: price, attrs: {}
price's text is 39.95
end element: price
end element: book
end element: bookstore

Selenium简介和实战
简单实用,模拟浏览器
关键命令:
find_element(s)_by_tag_name
find_element(s)_by_css_selector
电商网站数据爬取
关于chromedriver.exe停止运行问题可以参见如下博客:
http://blog.csdn.net/huilan_same/article/details/51896672

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值