首页 > 技术文章 > BeautifulSoup 基本选择器,标准选择器,css选择器

hanbinglengxie 2019-07-18 15:58 原文

注意事项

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里的内容

 结束

推荐阅读