爬虫基础学习笔记1

选择元素方式学习

XPATH学习

基本规则

1
2
3
4
"/": 表示根节点
"//": 表示任意位置的某一节点
"@": 表示某个属性 //div[@id='xx']
"|": 表示匹配前后规则元素

通配符

1
2
"*": 表示匹配任意元素节点
"@*": 表示匹配任意属性

CSS选择器

基本规则

1
2
3
4
"*": 表示任意元素
"E": 表示E标签元素
".": 表示class选择 //.info 等价 class='info'
"#": 表示id选择 //#name 等价 id='name'

组合

1
2
3
4
",": 代表或 //X,O 表示匹配X或Y元素
" ": 代表后代选择 //X O 表示匹配X的后代O元素(X以下元素)
">": 代表子代选择 //X>O 表示匹配X的子代元素O(子元素)
"+": 代表相邻兄弟元素 //X+O 表示匹配与X相邻的兄弟元素O

属性

1
2
3
4
5
"X[att]" //基本表示方法
"X[att~=val]" //匹配所有att属性值之一为val的元素
"X[att^=val]" //匹配以val开头的att属性值的元素
"X[att$=val]" //匹配以val结尾的att属性值的元素
"X[att*=val]" //匹配att属性值含有val字符的元素

Beautiful Soup基础学习

find_all函数的学习

1
2
3
4
5
soup.find_all('a') //所有a标签
soup.find_all('a','sister') //所有class为sister的a标签
soup.find_all(id='link1') //所有id=link1的标签 这里id可以是除class以外的属性名 当然 你也可以使用 soup.find_all('a',id='link1')
soup.find_all(class_='sister') //在搜索class时要使用class_
soup.find_all(id=re.compile('^link')) //可以使用正则 不指定id的话 默认对标签名进行搜索

特别注意 find_all函数可以使用正则匹配 这对我们在筛选所需要的信息时 有很大帮助

基础

1
2
3
4
soup=Beautiful(html,'lxml') //由lxml解析器解析html
suop.a //获取第一个元素a标签
soup.a.get_text() //获取第一个元素a标签的text内容
soup.a.get(att) //获取第一个元素a标签的属性att的值

BeautifulSoup可以支持CSS选择器,使用.select()方法即可
同时BeautifulSoup还有很多对节点关系的操作 这里 贴出文档地址 那就节点关系在以后的学习应该会慢慢用到 BeautifulSoup

使用

这里使用BeautifulSoup 来对前一篇文章的爬虫就行一些修改 修改内容:
只爬取有关mysql的文章 使用find_all来进行删选 ,这里将思路代码特出即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from bs4 import BeautifulSoup
import requests
import lxml
import re
urls=[]
url="http://l0ca1.me"
html=requests.get(url=url).text
soup=BeautifulSoup(html,"lxml")
sites=soup.find_all('div','post-title')
for site in sites:
link=site.find_all('a',href=re.compile(r'mysql',re.I))
try:
urll=url+link[0].get('href')
urls.append(urll)
except:
pass