BeautifulSoup 基本选择器,标准选择器,css选择器
注意事项
1、测试工具pycharm,请自行安装,
2、python3.x
3、需要导入requests库和bs4库
4、项目目录结构
run.py
# -*- coding: utf-8 -*- import rentspider if __name__ == '__main__': rentspider.run()
rentspider.py
# -*- coding: utf-8 -*- import requests from bs4 import BeautifulSoup def acc_page_msg(page_url): web_data = requests.get(page_url).content.decode('utf-8') soup = BeautifulSoup(web_data, 'html.parser') print(soup.title.string)#这里就是要填写的测试内容 def get_pages_urls(): urls = [] urls.append('http://www.xxx.com/test.asp') return urls def run(): url_list = get_pages_urls() for url in url_list: acc_page_msg(url)
测试开始~~~~~~~~~
标签选择器
示例代码:
<html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>title-name</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> </head> <body> <p name="one-name">
<b>one-one</b>
<b>one-two</b>
</p> <p name="two-name">two</p> </body> </html>
print(soup.title)#将title标签里的代码,含title print(soup.head)#获取head标签内代码,含head print(soup.p)#获取第一个p标签代码,含p print(soup.title.name)#获取标签的名称,如这个显示为title标签
print(soup.p.attrs['name'])#获取p标签的name属性的值 print(soup.p['name'])#等同与上一条指令
print(soup.p.string)#获取标签p内的内容,不含p print(soup.head.title.string)#层层迭代,获取head标签里的title标签里的文本 #获取p标签里的所有子节点,以list保存 print(soup.p.contents)#获取p标签里的所有子节点,以list保存 #获取p标签里的所有子节点,以迭代输出 print(soup.p.children) for i, child in enumerate(soup.p.children): print(i, child) #获取p标签里的所有子节点以及子孙节点(子节点对应的子节点) print(soup.p.descendants) for i, child in enumerate(soup.p.descendants): print(i, child) #获取标签的父节点(前一级的节点) print(soup.a.parent) #获取标签所有的祖先节点(父节点的父节点的父节点。。。直到最顶层(把整个文档输出)) print(list(enumerate(soup.a.parents))) #兄弟节点 print(list(enumerate(soup.a.next_siblings))) print(list(enumerate(soup.a.previous_siblings)))
标准选择器
示例代码如下:
<div class="panel"> <div class="panel-heading"> <h4>Hello</h4> </div> <div class="panel-body"> <ul class="list" id="list-1"> <li class="element">Foo</li> <li class="element">Bar</li> <li class="element">Jay</li> </ul> <ul class="list list-small" id="list-2"> <li class="element">Foo</li> <li class="element">Bar</li> </ul> </div> </div>
1,find_all方法
find_all( name , attrs , recursive , text , **kwargs )
可根据标签名、属性、内容查找文档
name(标签名字选择)
print(soup.find_all('ul'))#查询所有便签为ul的元素 print(type(soup.find_all('ul')[0]))
# 嵌套搜索
for ul in soup.find_all('ul'): print(ul.find_all('li'))
attr(标签的属性选择)
print(soup.find_all(attrs={'id': 'list-1'})) print(soup.find_all(attrs={'name': 'elements'}))
print(soup.find_all(id='list-1')) #只选择element属性的内容, 注意样式class与关键字重复,故用class_ print(soup.find_all(class_='element'))
text(文本选择)
print(soup.find_all(text='Foo'))
2、find方法
find( name , attrs , recursive , text , **kwargs )
find返回单个元素,find_all返回所有元素
print(soup.find('ul')) print(type(soup.find('ul'))) print(soup.find('page'))
3,其他的一些find方法
find_parents() find_parent()
find_parents()返回所有祖先节点,find_parent()返回直接父节点。
find_next_siblings() find_next_sibling()
find_next_siblings()返回后面所有兄弟节点,find_next_sibling()返回后面第一个兄弟节点。
find_previous_siblings() find_previous_sibling()
find_previous_siblings()返回前面所有兄弟节点,find_previous_sibling()返回前面第一个兄弟节点。
find_all_next() find_next()
find_all_next()返回节点后所有符合条件的节点, find_next()返回第一个符合条件的节点
find_all_previous() 和 find_previous()
find_all_previous()返回节点后所有符合条件的节点, find_previous()返回第一个符合条件的节点
CSS选择器
通过select()直接传入CSS选择器即可完成选择
示例代码如下:
<div class="panel"> <div class="panel-heading"> <h4>Hello</h4> </div> <div class="panel-body"> <ul class="list" id="list-1"> <li class="element">Foo</li> <li class="element">Bar</li> <li class="element">Jay</li> </ul> <ul class="list list-small" id="list-2"> <li class="element">Foo</li> <li class="element">Bar</li> </ul> </div> </div>
1,基本语法
print(soup.select('.panel .panel-heading'))#选择class的类型 print(soup.select('ul li'))#直接选择标签 print(soup.select('#list-2 .element'))#选择id的类型 print(type(soup.select('ul')[0]))
2,层层迭代
for ul in soup.select('ul'): print(ul.select('li'))
3,获取属性
for ul in soup.select('ul'): print(ul['id'])#这两种方法都能获取标签的属性(id或其他) print(ul.attrs['id'])
4,获取内容
for li in soup.select('li'): print(li.get_text())#输出li里的内容