爬虫中节点选取方法-xpath,css选择器用法
xpath选择
-
选取所有节点
-
xpath('//*')
-
-
选取子节点
- /获取直接子节点
- //获取子孙节点
-
xpath('//li/a')
-
选取父节点
- 按位置和属性来获取,@代表属性,@也可用于过滤
-
xpath('//a[@href="link4.html"]/../@class')
-
xpath('//a[@href="link4.html"]/parent::*/@class')
-
- 按位置和属性来获取,@代表属性,@也可用于过滤
-
按序选择
-
选取第一个 li[1]
-
xpath('//li[1]/a/text()')
-
-
选取最后一个li[last]
-
xpath('//li[last()]/a/text()')
-
-
选取任意位置 li[position()<n]
-
xpath('//li[position()<3]/a/text()')
-
-
反向选取li[last()-2]
-
xpath('//li[last()-2]/a/text()')
-
-
-
节点轴选择
-
祖先节点,ancestor
-
xpath('//li[1]/ancestor::*')
-
xpath('//li[1]/ancestor::div')
-
-
获取所有属性值attribute
-
xpath('//li[1]/attribute::*')
-
-
子节点选择,可以加筛选条件,child
-
xpath('//li[1]/child::a[@href="link1.html"]')
-
-
获取所有子孙节点,加入限定条件,不加为*,descendant
-
xpath('//li[1]/descendant::span"]')
-
-
选取当前节点之后的所有节点,following
-
xpath('//li[1]/following::*[2]"]')
-
-
获取当前节点的所有同级节点,following-sibiling
-
xpath('//li[1]/following-sibling::*"]')
-
-
-
属性多值匹配(contains),contains
-
xpath('//li[contains(@class,"li")]/a/text()')
-
-
多属性匹配 class属性里的para
-
xpath('//div[contains(@class,"para") and contains(@label-module,"para")]/text()')
-
-
这里的节点选取要准确否则匹配不到文本
-
获取过滤的属性
-
xpath('//li[@class="item-0"]/a/text()')
-
-
获取全部的属性
-
xpath('//li/a/@href')
-
-
BeautifulSoup
-
导入模块
-
from bs4 import BeautifulSoup
-
-
创建对象
-
soup = BeautifulSoup(html,lxml)
-
-
类型
- bs4.element.Tag类型
-
获取属性
- 获取节点名称,name
- 获取节点所有属性,attrs
- soup.p.attrs
- 获取节点内容
- soup.p.string
-
嵌套选择
- soup.head.title
- soup.head.title.string
- soup.head.title
-
关联选择
- 返回的是直接子节点的列表
- soup.p.contents
- 子节点
- soup.p.children
- 子孙节点
- soup.p.descendants
- 父节点和祖先节点
- soup.a.parent
- soup.a.parents
- 下一个,上一个,兄弟节点,祖先节点
- soup.a.next_sibling
- soup.a.previous_sibling
- soup.a.next_siblings
- soup.a.previous_siblings
-
获取信息
-
list(soup.a.parents)[0]
-
list(soup.a.parents)[0].attrs['class']
-
-
方法选择器
-
find_all
-
soup.find_all(name='ul')
-
for ul in soup.find_all(name='ul') for li in ul.find_all(name='li') print(li.string)
-
传入属性查询,attrs
-
soup.find_all(attrs={'id':'list-1'}
-
-
关键词冲突时后加下划线
-
soup.find_all(class_='element')
-
-
获取文本text,利用正则来匹配需要的内容
-
soup.find_all(text=re.compile('link'))
-
-
-
find(),返回单个元素
- 方法同find_all()只不过返回的是第一个元素
-
find_parent()
-
find_parents()
-
find_next_siblings()
-
find_next_sibiling()
-
find_previous_siblings()
-
find_previous_sibling()
-
find_all_next() 返回节点后所有符合的内容
-
find_next() 返回节点后第一个符合的内容
-
find_all_previous()
-
find_previous()
-
-
css选择器,select方法
-
soup.select('.panel .panel-heading')
-
嵌套选择
-
for ul in soup.select('ul') print(ul.select('li'))
-
-
获取属性
-
for ul in soup.select('ul') print(ul['id']) print(ul.attrs['id'])
-
-
获取文本
-
for li in soup.select('li') print(li.get_text()) print(li.string)
-
-
pyquery
-
类型
- PyQuery类型
-
导入模块
- from pyquery import PyQuery as pq
-
字符串初始化方法
- doc = pq(html)
-
URL初始化方法
- doc = pq(url=‘https://www.baidu.com’)
-
文件初始化方法
-
doc = pq(filename='demo.html')
-
-
基本css选择器
-
doc('#content .list li')
-
-
查找节点
-
find()获取所有子节点
-
items = doc('.list') lis = items.find('li')
-
-
children()
-
items = doc('.list') lis = items.children('li')
-
-
parent()这里可以加入过滤器选择
-
items = doc('.list') lis = items.parent('li')
-
-
parents()
-
-
遍历节点,items,可用于提取节点,返回为一个生成器,经过遍历获得各个子节点
-
lis = doc('li').items() for i in lis: print(i)
-
-
获取信息
-
获取属性
- 返回多个节点时,调用attr(),只会得到第一个节点属性
- 通过遍历可返回所有节点的属性
-
a = doc('.item-0.active a') print(a.attr('href')) print(a.attr.href) for item in a.items(): print(item.attr('href'))
-
获取文本
-
doc = pq() a = doc('.item-0.active a') print(a.text) print(a.html())
-
-
节点操作
- addClass和removeClass
-
doc = pq() li = doc('.item-0.active') li.removeClass('active') li.addClass('active')
-
- addClass和removeClass
-
attr,text,html
-
doc = pq() li = doc('.item-0.active') #attr()属性修改属性,第一个参数为属性名,第二个参数为属性值 li.attr('name','link') #修改文本内容,标签 li.text('change item') li.html('<span>changed item</span>')
-
-
-
伪类选择器
-
doc = pq() #获取第一个节点 li = doc('li:first-child') #获取最后一个节点 li = doc('li:last-child') #获取第二个节点 li = doc('li:nth-child(2)') #获取第三个节点 li = doc('li:gt(2)') #获取偶数节点 li = doc('li:nth-child(2n)') #获取包含指定节点的节点 li = doc('li:contains(second)')
-