PHP
·
发表于 5年以前
·
阅读量:8410
from urllib.request import urlopen
def get_one_page(index):
url = 'https://maoyan.com/board/4?offset=%d' % (index * 10)
# 另一种方式: url = 'https://maoyan.com/board/4?offset={}/'.format(index * 10)
# 字符串的格式化处理 {} 占位符 使用format方式格式化字符串
response = urlopen(url)
return response.read().decode()
html = get_one_page(0)
'''
解析HTML中的内容
1) 使用BeautifulSoup库
a. 安装BeautifulSoup4库
在命令行中进入Python环境
执行 pip install beautifulsoup4
进入Python的交互模式 执行python命令
import bs4 如果没有任何错误, 表明安装成功
卸载 pip uninstall beautifulsoup4
过程中需要输入 y
b. 引入bs4
2) 使用XPath
3) 使用pyquery
'''
from bs4 import BeautifulSoup
'''
Beautifulsoup在解析HTML时,可以设置解析值
1)HTML parser
2) lxml
3) 解析HTML5
'''
soup = BeautifulSoup(html,'html.parser')#指定一种方法解析
#打印soup对象的内容
print(soup.prettify())
#方法一(使用.的方式):获取title标签,使用标签名获取DOM树标签节点;缺点:只能获得页面中的第一个标签
title = soup.title
print(title.get_text())
print(soup.p)
# 方法二(使用函数方式):1、find_all() 返回所以符号条件的标签
ls_p = soup.find_all('p')
print(ls_p)
#遍历打印所以标签
for p in ls_p:
print(p)
#2、find() 只返回第一个符合条件的标签(相当于soup.p方法)
p = soup.find('p')
print(p)
#获取标签内的文本内容,
body = soup.body
print(body.string)#当一个Tag对象有多个子节点时,可以用.string方法再通过遍历获得所有子节点的内容。
print(body.get_text())#如果你仅仅想要得到文档或者标签的文本部分,它能以一个单一的一个Unicode串的形式返回文档中或者Tag对象下的所有文本。
#CSS选择器
'''
1)标签
2)ID
3)class
'''
p = soup.select('.board-content')#选用class选择
print(p)
'''
1.标签选择
2.方法选择
3.CSS选择'''
print(soup.find_all('ul',attrs={'class' : 'navbar'}))
'''
节点遍历 :
1.直接使用属性
contens(获取当前节点的所有直接子节点,但是字符串也会被解析成一个孤立的节点)
children 当前节点的所有子孙节点.
2. 方法
find find_all
'''
subnav = soup.select('.subnav')
print(subnav[0].contents)
for child in subnav[0].children:
print(child)
ls_a = subnav[0].find_all('a')
for a in ls_a:
print(a)
print(a.get_text())
#访问节点属性(以字典保存,则取属性)
print(a.attrs.get('href'))#用中括号,越界会报错;用get越界返回空
'''
我们在写 CSS 时,标签名不加任何修饰,类名(class="className"引号内即为类名)前加点,id名(id="idName"引号前即为id名)前加 #,
# 在这里我们也可以利用类似的方法来筛选元素,用到的方法是 soup.select(),返回类型是 list
例:
print soup.select('title') #标签
print soup.select('.sister') #类名
print soup.select('#link1') #ID
'''