CSS
- css = Cascading Style Sheets
- 样式定义如何显示HTML元素
- 选择器: eg: h1{color: red; font-size: 14px}
- 元素选择器: 直接选择文档元素。
- 类选择器:
- 元素的class属性,eg: < h1 class=”important”>
- .important选择所有有这个类属性的元素
- 结合元素选择器,比如p.important
- id选择器
- 属性选择器
XPath
- nodename 选取此节点的所有子节点
- / 从根节点选取
- //从匹配的当前节点选择文档中的节点,而不考虑它们的位置。
- . 选取当前节点
- ..选取当前节点的父节点
- @ 选取属性
谓语:
嵌在[]中用来查找某个特定节点或包含某个指定值得节点。
- /bookstore/book[1]第一个book元素
- /bookstore/book[last()]最后一个book元素
- /bookstore/book[position()<3]选择前2个
- //title[@lang]选择所拥有有名为lang的属性的title元素
- /bookstore/book[price>35.00]
json
json = JavaScript Object Notation
类似XML, 但是比XML更小、更快,更易解析。
json解码后是一个字典
import json
obj = {'one': 1, 'two': 2, 'three': [1, 2, 3]}
encoded = json.dumps(obj)
print(type(encoded))
print(encoded)
decoded = json.loads(encoded)
print(type(decoded))
print(decoded)
python处理XML方法
- DOM把整个XML读入内存,解析为树,因此占用内存大,解析慢,优点是可以任意遍历数的节点。
- SAX流模式, 边读边解析,占用内存小,解析快,缺点是需要自己处理事件。
<?xml version="1.0"?>
<bookstore>
<book>
<title>Learn Python</title>
<price>100</price>
</book>
<book>
<title>Learn XML</title>
<price>80</price>
</book>
<\bookstore>
from xml.dom import minidom
doc = minidom.parse('book.xml')
root = doc.documentElement
print(type(root))
print(root.nodeName)
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)
import string
from xml.parsers.expat import ParseCreate
class DefaultSaxHandler:
def start_element(selt, 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()
parse = ParserCreate()
parse.StartElementHandler = handler.start_element #<book>
parser.EndElementHandler = handler.end_element
parser.CharacterHandler = handler.char_data
with open('book.xml', 'r') as f:
parser.Parse(f.read())
正则表达式
基本匹配规则
- [0-9]任意一个数字,等价\d
- [a-z]任意一个小写字母
- [A-Z]任意一个大写字母
- [\^0-9]匹配非数字,等价\D
- \w 等价[a-z0-9_],字母数字下划线
- \W等价对\w取非
- . 任意字符
- []匹配内部任意字符或子表达式
- [\^]对字符集合取非
- *匹配前面的字符或者子表达式0次或多次
- +匹配前一个字符至少一次
- ?匹配前一个字符0次或1次
- ^匹配字符串开头
- $匹配字符串结束
import re
#匹配3位数字-3到8个数字 \d{3}-\d{3,8}
mr = re.match(r'\d{3}-\d{3,8}', '010-223456')
print(mr.string)
#分组
m = re.match(r'(\d{3})-(\d{3,8})$', '010-12345')#'r'表示后面的是正则表达式,不对‘\’做转义字符处理
print(m.groups())#匹配结果
print(m.group(0))#原始字符串
print(m.group(1))#第一个分组
print(m.group(2))#第二个分组
#匹配时间
t = '20:15:45'
m = re.match(r'^(0[0-9]|1[0-9]|2[0-9]\:(0[0-9]|1[0-9]|2[0-9]|3[0-9]|4[0-9]|5[0-9]|6[0-9])\:(0[0-9]|1[0-9]|2[0-9]|3[0-9]|4[0-9]|5[0-9]|6[0-9])', t)
print(m.groups())
#分割字符串
p = re.compile(r'\d+')
print(p.split('one1two22three333'))
Selenium简介和实战
关键命令
- find_elements(s)_by_tag_name
- find_elements(s)_by_css_selector
环境配置
pip install selenium
谷歌浏览器驱动下载地址:http://chromedriver.storage.googleapis.com/index.html
注意要下载和浏览器版本一致的驱动。
电商网站数据爬取
from selenium import webdriver
import time
browser = webdriver.Chrome()
browser.set_page_load_timeout(30)
browser.get('http://www.17huo.com/search.html?sq=2&keyword=%E7%BE%8A%E6%AF%9B')
page_info = browser.find_element_by_css_selector('body > div.wrap > div.pagem.product_list_pager > div')
# print(page_info.text)
pages = int((page_info.text.split(',')[0]).split(' ')[1])
for page in range(pages):
if page > 2:
break
url = 'http://www.17huo.com/?mod=search&sq=2&keyword=%E7%BE%8A%E6%AF%9B&page=' + str(page + 1)
browser.get(url)
browser.execute_script("window.scrollTo(0, document.body.scrollHeight);")
time.sleep(3) # 不然会load不完整
goods = browser.find_element_by_css_selector('body > div.wrap > div:nth-child(2) > div.p_main > ul').find_elements_by_tag_name('li')
print('%d页有%d件商品' % ((page + 1), len(goods)))
for good in goods:
try:
title = good.find_element_by_css_selector('a:nth-child(1) > p:nth-child(2)').text
price = good.find_element_by_css_selector('div > a > span').text
print(title, price)
except:
print(good.text)