>  기사  >  백엔드 개발  >  한 기사로 Python 크롤러 파서 BeautifulSoup4 이해하기

한 기사로 Python 크롤러 파서 BeautifulSoup4 이해하기

WBOY
WBOY앞으로
2022-07-12 16:56:552580검색

이 기사에서는 크롤러 파서 BeautifulSoup4와 관련된 문제를 주로 정리하는 Python에 대한 관련 지식을 제공합니다. Beautiful Soup는 HTML 또는 XML 파일에서 데이터를 추출할 수 있는 Python 라이브러리로, 여러분이 선호하는 변환기가 일반적인 방법을 구현합니다. 문서 탐색, 검색, 수정에 대해 모두에게 도움이 되기를 바랍니다.

한 기사로 Python 크롤러 파서 BeautifulSoup4 이해하기

【관련 권장사항: Python3 동영상 튜토리얼

1. BeautifulSoup4 라이브러리 소개

1. 소개

Beautiful Soup은 HTML 또는 XML 파일에서 데이터를 추출할 수 있는 Python 라이브러리입니다. 즐겨 사용하는 변환기는 문서를 탐색하고 찾고 수정하는 즐겨찾는 방법을 구현하여 몇 시간 또는 며칠의 작업 시간을 절약해 줍니다.

BeautifulSoup4는 웹 페이지를 DOM 트리로 변환합니다:
한 기사로 Python 크롤러 파서 BeautifulSoup4 이해하기

2 모듈을 다운로드합니다.

1 창 컴퓨터에서 win 키 + R을 클릭하고 를 입력합니다. cmdwin键+ R,输入:cmd

한 기사로 Python 크롤러 파서 BeautifulSoup4 이해하기

2. 安装beautifulsoup4,输入对应的pip命令pip install beautifulsoup4 ,我已经安装过了出现版本就安装成功了

한 기사로 Python 크롤러 파서 BeautifulSoup4 이해하기
3. 导包

form bs4 import BeautifulSoup

3. 解析库

BeautifulSoup在解析时实际上依赖解析器,它除了支持Python标准库中的HTML解析器外,还支持一 些第三方解析器(比如lxml):

여기에 이미지 설명 삽입
解析器 使用方法 优势 劣势
Python标准库 BeautifulSoup(html,’html.parser’) Python的内置标准库、执行速度适中、文档容错能力强 Python 2.7.3及Python3.2.2之前的版本文档容错能力差
lxml HTML解析库 BeautifulSoup(html,’lxml’) 速度快、文档容错能力强 需要安装C语言库
lxml XML解析库 BeautifulSoup(html,‘xml' 速度快、唯一支持XML的解析器 需要安装C语言库
htm5lib解析库 BeautifulSoup(html,’htm5llib’) 2. beautifulsoup4를 설치하고 해당 pip 명령을 입력합니다: pip install beautifulsoup4 . 이미 해당 버전을 설치했으며 성공적으로 설치되었습니다
3. Strong> 🎜
from bs4 import BeautifulSoup

html = '''
<p>
    </p><p>
        </p><h4>Hello</h4>
    
    <p>
        </p>
                
  • Foo
  •             
  • Bar
  •             
  • Jay
  •         
        
                
  • Foo
  •                 百度官网             
  • Bar
  •         
       '''# 创建对象soup = BeautifulSoup(html, 'lxml')🎜3. 구문 분석 라이브러리🎜🎜BeautifulSoup은 실제로 구문 분석 시 구문 분석기에 의존합니다. Python 표준 라이브러리에서 HTML 구문 분석기를 지원하는 것 외에도 일부 타사 구문 분석기(예: lxml)도 지원합니다. > 파서 사용 장점 단점🎜 🎜Python 표준 라이브러리🎜🎜BeautifulSoup(html,'html.parser')🎜🎜Python의 내장 표준 라이브러리, 적당한 실행 속도, 강력한 문서 내결함성🎜🎜Python 2.7. 3 및 Python3.2.2 이전 버전은 문서 내결함성이 낮습니다🎜🎜 🎜lxml HTML 구문 분석 라이브러리🎜🎜BeautifulSoup(html,'lxml')🎜🎜빠른 속도와 강력한 문서 내결함🎜🎜 C 언어 라이브러리 설치 필요🎜🎜 🎜lxml XML 구문 분석 라이브러리🎜🎜BeautifulSoup(html,'xml'🎜🎜fast, XML을 지원하는 유일한 파서🎜🎜C 언어 라이브러리 설치 필요🎜 🎜🎜htm5lib 구문 분석 라이브러리🎜🎜BeautifulSoup(html,'htm5llib')🎜🎜최고의 내결함성, 브라우저에서 문서 구문 분석, HTMLS 형식으로 문서 생성🎜🎜느린 속도, 쉽지 않음 외부 확장 기능을 활용하세요🎜🎜🎜🎜

对于我们来说,我们最常使用的解析器是lxml HTML解析器,其次是html5lib.

二、上手操作

1. 基础操作

1. 读取HTML字符串:

from bs4 import BeautifulSoup

html = '''
<p>
    </p><p>
        </p><h4>Hello</h4>
    
    <p>
        </p>
                
  • Foo
  •             
  • Bar
  •             
  • Jay
  •         
        
                
  • Foo
  •                 百度官网             
  • Bar
  •         
       '''# 创建对象soup = BeautifulSoup(html, 'lxml')

2. 读取HTML文件

from bs4 import BeautifulSoup

soup = BeautifulSoup(open('index.html'),'lxml')

3. 基本方法

from bs4 import BeautifulSoup

html = '''
<p>
    </p><p>
        </p><h4>Hello</h4>
    
    <p>
        </p>
                
  • Foo
  •             
  • Bar
  •             
  • Jay
  •         
        
                
  • Foo
  •                 百度官网             
  • Bar
  •         
       '''# 创建对象soup = BeautifulSoup(html, 'lxml')# 缩进格式print(soup.prettify())# 获取title标签的所有内容print(soup.title)# 获取title标签的名称print(soup.title.name)# 获取title标签的文本内容print(soup.title.string)# 获取head标签的所有内容print(soup.head)# 获取第一个p标签中的所有内容print(soup.p)# 获取第一个p标签的id的值print(soup.p["id"])# 获取第一个a标签中的所有内容print(soup.a)# 获取所有的a标签中的所有内容print(soup.find_all("a"))# 获取id="u1"print(soup.find(id="u1"))# 获取所有的a标签,并遍历打印a标签中的href的值for item in soup.find_all("a"):     print(item.get("href"))# 获取所有的a标签,并遍历打印a标签的文本值for item in soup.find_all("a"):     print(item.get_text())

2. 对象种类

Beautiful Soup将复杂HTML文档转换成一个复杂的树形结构,每个节点都是Python对象,所有对象可以归纳为4种: Tag , NavigableString , BeautifulSoup , Comment .

(1)Tag:Tag通俗点讲就是HTML中的一个个标签,例如:

soup = BeautifulSoup('<b>Extremely bold</b>','lxml')
tag = soup.b
print(tag)
print(type(tag))

输出结果:

<b>Extremely bold</b>
<class></class>

Tag有很多方法和属性,在 遍历文档树 和 搜索文档树 中有详细解释.现在介绍一下tag中最重要的属性: nameattributes

name属性:

print(tag.name)
# 输出结果:b
# 如果改变了tag的name,那将影响所有通过当前Beautiful Soup对象生成的HTML文档:
tag.name = "b1"
print(tag)
# 输出结果:<b1>Extremely bold</b1>

Attributes属性:

# 取clas属性
print(tag['class'])

# 直接”点”取属性, 比如: .attrs :
print(tag.attrs)

tag 的属性可以被添加、修改和删除:

# 添加 id 属性
tag['id'] = 1

# 修改 class 属性
tag['class'] = 'tl1'

# 删除 class 属性
del tag['class']

(2)NavigableString:用.string获取标签内部的文字:

print(soup.b.string)print(type(soup.b.string))

(3)BeautifulSoup:表示的是一个文档的内容,可以获取它的类型,名称,以及属性:

print(type(soup.name))
# <type>

print(soup.name)
# [document]

print(soup.attrs)
# 文档本身的属性为空</type>

(4)Comment:是一个特殊类型的 NavigableString 对象,其输出的内容不包括注释符号。

print(soup.b)

print(soup.b.string)

print(type(soup.b.string))

3. 搜索文档树

1.find_all(name, attrs, recursive, text, **kwargs)

(1)name 参数:name 参数可以查找所有名字为 name 的tag,字符串对象会被自动忽略掉

  • 匹配字符串:查找与字符串完整匹配的内容,用于查找文档中所有的<a></a>标签

    a_list = soup.find_all("a")print(a_list)
  • 匹配正则表达式:如果传入正则表达式作为参数,Beautiful Soup会通过正则表达式的 match() 来匹配内容

    # 返回所有表示和<b>标签for tag in soup.find_all(re.compile("^b")):
        print(tag.name)</b>
  • 匹配列表:如果传入列表参数,Beautiful Soup会将与列表中任一元素匹配的内容返回

    # 返回所有所有<p>标签和<a>标签:soup.find_all(["p", "a"])</a></p>

(2)kwargs参数

soup.find_all(id='link2')

(3)text参数:通过 text 参数可以搜搜文档中的字符串内容,与 name 参数的可选值一样, text 参数接受 字符串 , 正则表达式 , 列表

# 匹配字符串
soup.find_all(text="a")

# 匹配正则
soup.find_all(text=re.compile("^b"))

# 匹配列表
soup.find_all(text=["p", "a"])

4. css选择器

我们在使用BeautifulSoup解析库时,经常会结合CSS选择器来提取数据。

注意:以下讲解CSS选择器只选择标签,至于获取属性值和文本内容我们后面再讲。

1. 根据标签名查找:比如写一个 li 就会选择所有li 标签, 不过我们一般不用,因为我们都是精确到标签再提取数据的

from bs4 import BeautifulSoup

html = '''
<p>
    </p><p>
        </p><h4>Hello</h4>
    
    <p>
        </p>
                
  • Foo
  •             
  • Bar
  •             
  • Jay
  •         
        
                
  • Foo
  •                 百度官网             
  • Bar
  •         
       '''# 创建对象soup = BeautifulSoup(html, 'lxml')# 1. 根据标签名查找:查找li标签print(soup.select("li"))

输出结果:

[
  • Foo
  • Bar
  • Jay
  • Foo
  • Bar
  • ]

    2. 根据类名class查找.1ine, 即一个点加line,这个表达式选的是class= "line "的所有标签,".”代表class

    print(soup.select(".panel_body"))

    输出结果:

    
    
    • Foo
    • Bar
    ]

    3. 根据id查找。#box,即一个#和box表示选取id-”box "的所有标签,“#”代表id

    print(soup.select("#list-1"))

    输出结果:

    [
    • Foo
    • Bar
    • Jay
    ]

    4. 根据属性的名字查找。class属性和id属性较为特殊,故单独拿出来定义一个". "“”来表示他们。

    比如:input[ name=“username”]这个表达式查找name= "username "的标签,此处注意和xpath语法的区别

    print(soup.select('ul[ name="element"]'))

    输出结果:

    [
    • Foo
    • Bar
    • Jay
    ]

    5. 标签+类名或id的形式。

    # 查找id为list-1的ul标签
    print(soup.select('ul#list-1'))
    print("-"*20)
    # 查找class为list的ul标签
    print(soup.select('ul.list'))

    输出结果:

    [
    • Foo
    • Bar
    • Jay
    ] -------------------- [
    • Foo
    • Bar
    • Jay
    • Foo
    • Bar
    ]

    6. 查找直接子元素

    # 查找id="list-1"的标签下的直接子标签liprint(soup.select('#list-1>li'))

    输出结果:

    [
  • Foo
  • Bar
  • Jay
  • ]

    7. 查找子孙标签

    # .panel_body和li之间是一个空格,这个表达式查找id=”.panel_body”的标签下的子或孙标签liprint(soup.select('.panel_body li'))

    输出结果:

    [
  • Foo
  • Bar
  • Jay
  • Foo
  • Bar
  • ]

    8. 取某个标签的属性

    # 1. 先取到<p>p = soup.select(".panel_body")[0]# 2. 再去下面的a标签下的href属性print(p.select('a')[0]["href"])</p>

    输出结果:

    https://www.baidu.com

    9. 获取文本内容有四种方式:

    (a) string:获得某个标签下的文本内容,强调-一个标签,不含嵌我。 返回-个字符串

    # 1. 先取到<p>p = soup.select(".panel_body")[0]# 2. 再去下面的a标签下print(p.select('a')[0].string)</p>

    输出结果:

    百度官网

    (b) strings:获得某个标签下的所有文本内容,可以嵌套。返回-一个生成器,可用list(生成器)转换为列表

    print(p.strings)print(list(p.strings))

    输出结果:

    <generator>['\n', '\n', 'Foo', '\n', 'Bar', '\n', 'Jay', '\n', '\n', '\n', 'Foo', '\n', '百度官网', '\n', 'Bar', '\n', '\n']</generator>

    (c)stripped.strings:跟(b)差不多,只不过它会去掉每个字符串头部和尾部的空格和换行符

    print(p.stripped_strings)print(list(p.stripped_strings))

    输出结果:

    <generator>['Foo', 'Bar', 'Jay', 'Foo', '百度官网', 'Bar']</generator>

    (d) get.text():获取所有字符串,含嵌套. 不过会把所有字符串拼接为一个,然后返回
    注意2:
    前3个都是属性,不加括号;最后一个是函数,加括号。

    print(p.get_text())

    输出结果:

    Foo
    Bar
    Jay
    
    
    Foo
    百度官网
    Bar

    【相关推荐:Python3视频教程

    위 내용은 한 기사로 Python 크롤러 파서 BeautifulSoup4 이해하기의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

    성명:
    이 기사는 csdn.net에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제