파이썬 파충류 (여덟) BeautifulSoup로 라이브러리의 사용

일반에 관한 기사는 사실, 많은 사람들이, 파충류 사용하는 불편, 플러스 많은 규칙을 작성할 필요, 그래서 특히 숙련 된 아니라, 우리가 BeautifulSoup로 언급이 부분은 매우 강력한 도구입니다 무기.

BeautifulSoup로 "맛있는 수프, 녹색 수프"

유연하고 편리한 웹 페이지 구문 분석 라이브러리, 처리 효율, 여러 파서를 지원합니다.
웹 사이트 기어에 대한 정보의 실현을 용이하게 할 수 대신 정규 표현식을 작성하는 그것을 사용

빨리

아래의 예에 의해, BS4의 간단한 이해가, 그리고 전원 보면 :

BS4에서 수입 BeautifulSoup로 

HTML = '' ' 
<HTML> <HEAD> <TITLE>는 겨울잠 쥐의 이야기 </ 제목> </ head> 
<body> 
<P 클래스 = "제목"> <b>를 겨울잠 쥐의 이야기 </ B> </ P> 

<P 클래스 = "이야기"> 일단 세 개의 작은 자매했다가 시간에 따라; 자신의 이름이 있었다 
<a href="http://example.com/elsie" class="sister" id="link1"> 엘지 </a>를, 
<A HREF가 "= http://example.com/lacie "클래스 ="자매 "ID ="링크 2 "> 라씨 </a> 및 
<a href="http://example.com/tillie" class="sister" id="link3"> Tillie </a>에; 
그들은 잘 하단에 살았습니다. </ P> 
인쇄 (soup.title.parent.name) 
인쇄 (soup.p) 
인쇄 (soup.p [ "클래스"]) 
인쇄 (soup.a) 
인쇄 (soup.find_all에게 ( 'A' )) 
프린트 (soup.find (ID = 'LINK3'))

결과는 다음과 같다 :

코드를 사용하여 분석 BeautifulSoup로는 목적은 BeautifulSoup로 획득 할 수 있고, 압입의 기본 구성에 따른 출력 할 수있다.

동시에 우리는 다음과 같은 코드에 의해 각각의 모든 링크 및 텍스트를 얻을 수 있습니다 :

soup.find_all에서 링크 ( 'A')에 대한 : 
    인쇄 (link.get ( 'HREF')) 

인쇄 (soup.get_text ())

파서

아름다운 수프는 빠른 설치를 권장 LXML 파서 더 강력한, HTML 파서 파이썬 표준 라이브러리는 또한 우리가 그것을 설치하지 않는 경우, 파이썬은 기본 파이썬 파서를 사용, 타사 파서을 지원합니다 지원합니다.

다음은 일반적인 파서 있습니다 :

LXML 때문에 높은 효율, 파서로 추천합니다. 내장 된 HTML 구문 분석 방법 파이썬 표준 라이브러리의 해당 버전이 충분히 안정되지 않기 때문에 이전 3.2.2 버전에서 이전 버전과 Python3 Python2.7.3에서, 당신은 LXML 또는 html5lib를 설치해야합니다 .

기본 사용

태그 선택

빠른 사용, 우리는 다음과 같은 코드를 추가
인쇄 (soup.title)
(유형 (soup.title)) 인쇄
인쇄 (soup.head)
인쇄 (soup.p를)

通过这种soup.标签名 我们就可以获得这个标签的内容
这里有个问题需要注意,通过这种方式获取标签,如果文档中有多个这样的标签,返回的结果是第一个标签的内容,如上面我们通过soup.p获取p标签,而文档中有多个p标签,但是只返回了第一个p标签内容

获取名称

当我们通过soup.title.name的时候就可以获得该title标签的名称,即title

获取属性

print(soup.p.attrs['name'])
print(soup.p['name'])
上面两种方式都可以获取p标签的name属性值

获取内容

print(soup.p.string)
结果就可以获取第一个p标签的内容:
The Dormouse's story

嵌套选择

我们直接可以通过下面嵌套的方式获取

print(soup.head.title.string)

子节点和子孙节点

contents的使用
通过下面例子演示:

html = """
<html>
    <head>
        <title>The Dormouse's story</title>
    </head>
    <body>
        <p class="story">
            Once upon a time there were three little sisters; and their names were
            <a href="http://example.com/elsie" class="sister" id="link1">
                <span>Elsie</span>
            </a>
            <a href="http://example.com/lacie" class="sister" id="link2">Lacie</a>
            and
            <a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>
            and they lived at the bottom of a well.
        </p>
        <p class="story">...</p>
"""

from bs4 import BeautifulSoup

soup = BeautifulSoup(html,'lxml')
print(soup.p.contents)

结果是将p标签下的所有子标签存入到了一个列表中

列表中会存入如下元素

children的使用

通过下面的方式也可以获取p标签下的所有子节点内容和通过contents获取的结果是一样的,但是不同的地方是soup.p.children是一个迭代对象,而不是列表,只能通过循环的方式获取素有的信息

print(soup.p.children)
for i,child in enumerate(soup.p.children):
    print(i,child)

通过contents以及children都是获取子节点,如果想要获取子孙节点可以通过descendants
print(soup.descendants)同时这种获取的结果也是一个迭代器

父节点和祖先节点

通过soup.a.parent就可以获取父节点的信息

通过list(enumerate(soup.a.parents))可以获取祖先节点,这个方法返回的结果是一个列表,会分别将a标签的父节点的信息存放到列表中,以及父节点的父节点也放到列表中,并且最后还会讲整个文档放到列表中,所有列表的最后一个元素以及倒数第二个元素都是存的整个文档的信息

兄弟节点

soup.a.next_siblings 获取后面的兄弟节点
soup.a.previous_siblings 获取前面的兄弟节点
soup.a.next_sibling 获取下一个兄弟标签
souo.a.previous_sinbling 获取上一个兄弟标签

标准选择器

find_all

find_all(name,attrs,recursive,text,**kwargs)
可以根据标签名,属性,内容查找文档

name的用法

html='''
<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>
'''
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')
print(soup.find_all('ul'))
print(type(soup.find_all('ul')[0]))

结果返回的是一个列表的方式

同时我们是可以针对结果再次find_all,从而获取所有的li标签信息

for ul in soup.find_all('ul'):
    print(ul.find_all('li'))

attrs

例子如下:

html='''
<div class="panel">
    <div class="panel-heading">
        <h4>Hello</h4>
    </div>
    <div class="panel-body">
        <ul class="list" id="list-1" name="elements">
            <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>
'''
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')
print(soup.find_all(attrs={'id': 'list-1'}))
print(soup.find_all(attrs={'name': 'elements'}))

attrs可以传入字典的方式来查找标签,但是这里有个特殊的就是class,因为class在python中是特殊的字段,所以如果想要查找class相关的可以更改attrs={'class_':'element'}或者soup.find_all('',{"class":"element}),特殊的标签属性可以不写attrs,例如id

text

例子如下:

html='''
<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>
'''
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')
print(soup.find_all(text='Foo'))

结果返回的是查到的所有的text='Foo'的文本

find

find(name,attrs,recursive,text,**kwargs)
find返回的匹配结果的第一个元素

其他一些类似的用法:
find_parents()返回所有祖先节点,find_parent()返回直接父节点。
find_next_siblings()返回后面所有兄弟节点,find_next_sibling()返回后面第一个兄弟节点。
find_previous_siblings()返回前面所有兄弟节点,find_previous_sibling()返回前面第一个兄弟节点。
find_all_next()返回节点后所有符合条件的节点, find_next()返回第一个符合条件的节点
find_all_previous()返回节点后所有符合条件的节点, find_previous()返回第一个符合条件的节点

CSS选择器

通过select()直接传入CSS选择器就可以完成选择
熟悉前端的人对CSS可能更加了解,其实用法也是一样的
.表示class #表示id
标签1,标签2 找到所有的标签1和标签2
标签1 标签2 找到标签1内部的所有的标签2
[attr] 可以通过这种方法找到具有某个属性的所有标签
[atrr=value] 例子[target=_blank]表示查找所有target=_blank的标签

html='''
<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>
'''
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')
print(soup.select('.panel .panel-heading'))
print(soup.select('ul li'))
print(soup.select('#list-2 .element'))
print(type(soup.select('ul')[0]))

获取内容

通过get_text()就可以获取文本内容

html='''
<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>
'''
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')
for li in soup.select('li'):
    print(li.get_text())

获取属性
或者属性的时候可以通过[属性名]或者attrs[属性名]

html='''
<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>
'''
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')
for ul in soup.select('ul'):
    print(ul['id'])
    print(ul.attrs['id'])

总结

推荐使用lxml解析库,必要时使用html.parser
标签选择筛选功能弱但是速度快
建议使用find()、find_all() 查询匹配单个结果或者多个结果
如果对CSS选择器熟悉建议使用select()
记住常用的获取属性和文本值的方法

 

추천

출처www.cnblogs.com/shuai1991/p/11072117.html