CSS-选择器
- 元素选择器
直接选择文档元素
如head,p
类选择器
元素的class属性,如<h1 class = "important">
.important 选择所有有这个类属性的元素
可以结合元素选择器,如p.importantid选择器
与类选择器类似
与类选择器的区别: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