澳门威利斯人_威利斯人娱乐「手机版」

来自 办公软件 2019-05-18 19:34 的文章
当前位置: 澳门威利斯人 > 办公软件 > 正文

澳门威尼斯人平台Python爬虫利器

  通过get_text()艺术大家得以获得有个别tag下有所的文件内容。

1. 安装

2.1 tag 对象

tag 对象类似于七个标签节点。与XML或HTML原生文书档案中的标签同样,如 body,div,a,span。tag 对象有很多主意和品质。tag 对象的属性能够像字典同样进行增加和删除改查操作。

设置成功后,在深入分析网页的时候,内定为lxml就可以,使用方法如下:

2.1.2 attributes 属性

八个tag恐怕有成都百货上千个属性,使用 tag.attrs 获取 tag 的保有节点属性,能够对这么些属性进行增加和删除改查。获取情势如下:

  • tag.attrs:获取属性列表
  • tag.attrs[1]:获取属性列表中的第3本性情
  • tag.get('href'):获取 href 属性
  • tag['href']:获取 href 属性

三.三 兄弟节点

汉子节点就是独具一样父节点的同义词节点。如三.第11中学定义的 div_金沙澳门官网 ,html 中的三个p标签互相为兄弟节点。使用上边的节点tag属性访问兄弟节点

  • next_sibling:当前节点的下二个哥们节点
  • previous_sibling:当前节点的上一个小家伙节点
  • next_siblings:当前节点未来的具备兄弟节点
  • previous_siblings:当前节点在此以前的具备兄弟节点
>>> soup = BeautifulSoup('<b class="boldest">Extremely bold</b>')
>>> tag = soup.b
>>> type(tag)
<class 'bs4.element.Tag'>
>>> tag.name
'b'

②.一.3 多值属性

在HTML文书档案中有杰出像 class 同样的有三个属性值,这一个多值属性再次回到的值不是 string ,而是 list 。那一个多值属性的节点类型如下:

  • class
  • rel
  • rev
  • accept-charset
  • headers
  • accesskey

在XML文书档案中没有多值属性

content = '<a href="index.html" class="button button-blue" data="1 2 3"></a>'
soup = BeautifulSoup(content, 'lxml')
tag = soup.a  # 获取 a 标签
tag.name  # 标签名称:a
tag.attrs  # 属性列表:['href', 'class', 'data']
tag.get('href')  # 获取href属性:index.html
tag['class']  # 获取class属性为list:[button,button-blue]
tag['data']  # data属性的值为string:1 2 3

一.二 安装深入分析器 lxml

除此以外还亟需设置相应的分析器,lxml,html五lib 任选三个就能够。

# 安装 lxml
pip install lxml

# 安装 html5lib
pip install html5lib

CSS选择器

  在BeautifulSoup中,同样也支撑选拔CSS接纳器来开始展览搜寻。使用select(),在里边传入字符串参数,就可以行使CSS选取器的语法来找到tag。

>>> soup.select("title") 
[<title>The Dormouse's story</title>] 
>>> soup.select("p > a") 
[<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>, 
<a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>, 
<a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]

总结

  根本看了查找和遍历,修改文书档案树没怎么用到,就向来不看了。

 

3.1 子节点

二个 tag 或然含有多个字符串大概别的 tag,那几个 tag 正是顶层的子节点,Beautiful Soup提供了众多操作和遍历子节点的性质。必要专注:

  • 字符串未有子节点。
  • BeautifulSoup 对象自己自然会包蕴子节点

假诺有以下两种轻便的方式获取子节点:

  • 使用tag名:获取第3个直接子节点:soup.div.p
  • 选拔contents属性:获取具有直接子节点列表:soup.div.contents
  • 动用children属性: 对子节点举行巡回:soup.div.children
  • 应用descendants属性:全部tag的子孙节点进行递归循环:soup.div.descendants
  • 选拔string属性:获取唯有1个string子节点tag的子节点:p.string
  • 动用strings属性:循环有多少个string子节点的气象:div.strings

    div_html = '

    <p>uu</p>
    <p>sa</p>
    <p>
        <a>ma</a>
        -->
    </p>
    

    ' soup = BeautifulSoup(div_html), 'lxml') div = soup.div # 获取 div 节点 div.p #

    uu

    div.contents # [

    uu

    ,

    sa

    ,

    ma-->

    ] div.contents[0] #

    uu

    for child in div.children:

    print(child)
    

    #

    uu

    sa

    ma-->

    for child in div.descendants:

    pring(child)
    

2.一.3 多值属性

在HTML文书档案中有优异像 class 一样的有两个属性值,那么些多值属性重临的值不是 string ,而是 list 。这一个多值属性的节点类型如下:

  • class
  • rel
  • rev
  • accept-charset
  • headers
  • accesskey

在XML文书档案中未有多值属性

content = '<a href="index.html" class="button button-blue" data="1 2 3"></a>'
soup = BeautifulSoup(content, 'lxml')
tag = soup.a  # 获取 a 标签
tag.name  # 标签名称:a
tag.attrs  # 属性列表:['href', 'class', 'data']
tag.get('href')  # 获取href属性:index.html
tag['class']  # 获取class属性为list:[button,button-blue]
tag['data']  # data属性的值为string:1 2 3
解析器 使用方法 优势 劣势
Python标准库 BeautifulSoup(markup, "html.parser") Python的内置标准库执行速度适中文档容错能力强 Python 2.7.3 or 3.2.2)前 的版本中文档容错能力差
lxml HTML 解析器 BeautifulSoup(markup, "lxml") 速度快文档容错能力强 需要安装C语言库
lxml XML 解析器 BeautifulSoup(markup, ["lxml", "xml"])``BeautifulSoup(markup, "xml") 速度快唯一支持XML的解析器 需要安装C语言库
html5lib BeautifulSoup(markup, "html5lib") 最好的容错性以浏览器的方式解析文档生成HTML5格式的文档 速度慢不依赖外部扩展

4.1 过滤器

过滤器是利用寻觅方法进度中的相称规则,即参数的恐怕取值。过滤器可以为下边三种格局:

  • 字符串:find_all('div')
  • 列表:find_all(['div', 'span'])
  • 正则表达式:find_all(re.compile('[a-z]{1,3}'))
  • True:相称跋扈非字符串子节点
  • 办法:也正是相称的回调函数,该方法再次来到 True 表示卓殊

    content = '

    ' soup = BeautifulSoup(content), 'lxml') nav_node = soup.nav # nav_node.find_all(True) # 不匹配 string # ['a_1', 'a_2'] def has_class_but_no_id(tag): # 定义匹配函数

    return tag.has_attr('class') and not tag.has_attr('id')
    

    soup.find_all(has_class_but_no_id) # 重回有class属性未有id属性的节点

4.4 CSS选择器

Beautiful Soup协理抢先四分之二的CSS选取器,使用 select() 方法来搜索。如id选用器,标签选用器,属性选拔器设置组成选拔器。如:

  • soup.select('body a')
  • soup.select('#top')
  • soup.select('div > span')
  • soup.select('.button img')

 

2.2 NavigableString 对象

字符串常被含有在tag内,Beautiful Soup用 NavigableString 类来包装tag中的字符串。

  • 运用 tag.string 获取 tag 内字符串,为NavigableString
  • 选拔 unicode(tag.string) 调换为一般Unicode字符串
  • tag 内字符串无法编辑
  • tag.string.replace_with('content') 替换 tag 内字符串
  • tag 内字符串不支持 .contents 或 .string 属性或 find() 方法
  • 在Beautiful Soup之外使用 NavigableString 对象急需调用 unicode() 方法

1. 安装

pip install lxml

2. BeautifulSoup中的对象

Beautiful Soup将复杂HTML文档转变到三个繁杂的树形结构,类似于浏览器中的DOM节点数,每一种节点都是Python对象,全数目的足以总结为4种: Tag , NavigableString , BeautifulSoup , Comment 。

五. 改造文档树

当我们获取搜索结果以往,希望物色结果中的有个别节点不加入之后的搜寻,那么就供给把这几个节点删除掉,那就需求对文书档案树修改。修改的艺术如下:

  • append():向当前tag中增多内容(string)
  • new_tag(),new_string():增添一段文本
  • insert(index, content):在 index 地点插入属性
  • insert_before() 和 insert_after():在此时此刻节点光景插入内容
  • clear():移除当前节点内容
  • extract();将眼下tag移除文书档案树,并视作结果重回
  • decompose():将如今节点移除文书档案树并完全绝迹
  • replace_with():移除文书档案树中的某段内容,并用新tag或文本节点取代他
  • wrap():对点名的tag元素实行打包,并赶回包装后的结果
>>>tag.attrs
# {u'class': u'boldest'}
>>>tag.attrs["class"]
# ["boldest"]

6. 输出

偶尔,需求对查到的照旧涂改过的文书档案树展现只怕封存。
prettify() 方法将Beautiful Soup的文书档案树格式化后以Unicode编码输出,各种XML/HTML标签都占有1行。BeautifulSoup 对象和它的tag节点都得以调用 prettify() 方法。

可以对四个 BeautifulSoup 对象或 Tag 对象使用Python的 unicode() 或 str() 方法,从而对输出结果开始展览削减。

初稿地址:

2.2 NavigableString 对象

字符串常被含有在tag内,Beautiful Soup用 NavigableString 类来包装tag中的字符串。

  • 行使 tag.string 获取 tag 内字符串,为NavigableString
  • 选拔 unicode(tag.string) 调换为一般Unicode字符串
  • tag 内字符串不能够编辑
  • tag.string.replace_with('content') 替换 tag 内字符串
  • tag 内字符串不帮助 .contents 或 .string 属性或 find() 方法
  • 在Beautiful Soup之外使用 NavigableString 对象须要调用 unicode() 方法

 

一.叁 使用办法

设置了 BeautifulSoup 未来能够导入使用。将壹段文书档案传入BeautifulSoup 的构造方法,就能够获得三个文书档案的靶子, 能够流传壹段字符串或一个文件句柄.

# 首先从 bs4 导入
from bs4 inport BeautifulSoup

# 使用解析器和html文档可以初始化
soup = BeautifulSoup(open("index.html"), 'lxml')
content = '<html>data</html>'
soup = BeautifulSoup(content, 'lxml')

文书档案要求调换来Unicode,并且HTML的实例都被转变到Unicode编码

4.1 过滤器

过滤器是利用搜索方法进度中的相配规则,即参数的大概取值。过滤器可认为上面两种样式:

  • 字符串:find_all('div')
  • 列表:find_all(['div', 'span'])
  • 正则表达式:find_all(re.compile('[a-z]{1,3}'))
  • True:相配任性非字符串子节点
  • 主意:也正是相配的回调函数,该办法重临 True 表示1贰分

    content = '

    ' soup = BeautifulSoup(content), 'lxml') nav_node = soup.nav # nav_node.find_all(True) # 不匹配 string # ['a_1', 'a_2'] def has_class_but_no_id(tag): # 定义相配函数

    return tag.has_attr('class') and not tag.has_attr('id')
    

    soup.find_all(has_class_but_no_id) # 再次回到有class属性未有id属性的节点

官方普通话文档的:

1.1 安装 Beautiful Soup

Beautiful Soup三 如今已经告一段落维护,推荐应用 Beautiful Soup四,未来曾经被移植到 bs4,导入的时候必要从 bs四 导入。安装格局如下:

# 使用 pip 安装
pip install beautifulsoup4

# 使用 easy_install 安装
easy_install beautifulsoup4

4. 搜寻文书档案树

检索效果能够说是写爬虫进程中必用的魔法,用来寻觅钦赐的节点,Beautiful Soup定义了过多搜索方法,那些招来方法的参数和用法都很周边,查询作用格外庞大,上边主要针对 find_all 方法求证。

soup = BeautifulSoup(html_doc, 'lxml')

2.4 Comment 对象

Comment 对象是叁个特有类型的 NavigableString 对象,用来表示文书档案的注释部分。

markup = "<b><!--Hey, buddy. Want to buy a used parser?--></b>"
soup = BeautifulSoup(markup)
comment = soup.b.string
type(comment)  # <class 'bs4.element.Comment'>
print(soup.b.prettify())
# <b>
#  <!--Hey, buddy. Want to buy a used parser?-->
# </b>

一.三 使用方法

设置了 BeautifulSoup 今后能够导入使用。将壹段文书档案传入BeautifulSoup 的构造方法,就能够收获三个文书档案的靶子, 可以流传一段字符串或三个文件句柄.

# 首先从 bs4 导入
from bs4 inport BeautifulSoup

# 使用解析器和html文档可以初始化
soup = BeautifulSoup(open("index.html"), 'lxml')
content = '<html>data</html>'
soup = BeautifulSoup(content, 'lxml')

文书档案须求调换到Unicode,并且HTML的实例都被调换来Unicode编码

  以下是根本的二种解析器:

2.1.1 name 属性

name 属性表示 tag 的称呼。通过 .name 获取。借使改变了tag的name,那将震慑全部通过当前Beautiful Soup对象生成的HTML文书档案。

3.2 父节点

各样tag或字符串都有父节点,即种种节点都被含有在tag中,通过 .parent 属性来获取有个别成分的父节点: p.parent,通过成分的 .parents 属性能够递归得到成分的持有父辈节点。

soup =  BeautifulSoup(div_html), 'lxml')  # 使用3.1中定义的 div_html
div = soup.div # 获取 div 节点
sa = div.a.string  # 第一个 a 节点的string

sa.parent  # a 节点
sa.parent.parent # div 节点
for parent in sa.parents:
    print(parent)
# a
# div
# [document]
# None

  与 .text 相同。

5. 改动文书档案树

当大家得到搜索结果之后,希望物色结果中的有个别节点不参与之后的寻找,那么就供给把这个节点删除掉,这就供给对文书档案树修改。修改的章程如下:

  • append():向当前tag中增多内容(string)
  • new_tag(),new_string():增添1段文本
  • insert(index, content):在 index 地点插入属性
  • insert_before() 和 insert_after():在现阶段节点前后插入内容
  • clear():移除当前节点内容
  • extract();将最近tag移除文书档案树,并作为结果回到
  • decompose():将近日节点移除文书档案树并完全绝迹
  • replace_with():移除文书档案树中的某段内容,并用新tag或文本节点代替他
  • wrap():对点名的tag成分举行包装,并重返包装后的结果

4.2 find_all() find() 方法

find_all 方法再次来到相称找寻的装有节点的列表可能空,而 find 方法直接回到第3个非常找出的结果。详细的概念如下:

find_all(name=None, attrs={}, recursive=True, text=None, limit=None, **kwargs)
find_find(name=None, attrs={}, recursive=True, text=None, limit=None, **kwargs)

各参数含义如下:

  • name:匹配 tag 标签名
  • attrs:相配属性名:find_all(href='index.html')
  • text:相配文书档案中的字符串内容
  • limit:钦赐相配的结果集数量
  • recursive:暗中同意True,False表示只寻找直接子节点

以上的参数值都能够是 四.1中申明的随机壹种过滤器值。别的还索要留意以下几点:

  • attrs 参数为字典类型,能够是多少个性格条件构成
  • 独立行使 class 属性时,应该选用 class_
  • class 属性为多值属性,会独家寻找每种 CSS 类名
  • 根据CSS类目完全合营时,必须逐一一样

    # 找寻全数 div 标签 soup.find_all('div') # 寻觅全数具备id属性并且id属性值为 link一 照旧 link二 的节点 soup.find_all(id=['link1', 'link二']) # 寻觅全部 class 属性包蕴 button 的节点 soup.findall(class='button') # 找寻全部相配给定正则表明式内容的 p 标签 soup.find_all('p', text=re.compile('game')) # 寻找具有 button 类,并且有着值为 link一 的 href 属性的 a 标签 soup.find_all('a', {'classl': 'button', 'href': 'link壹'}) # 只寻觅1个直接子节点的 a 标签 soup.find_all('a', limit=1, recursive=False)

本文由澳门威利斯人发布于办公软件,转载请注明出处:澳门威尼斯人平台Python爬虫利器

关键词: 澳门威利斯人 python 编程语言