1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > Python爬虫自学之第(②)篇——BeautifulSoup解析网页

Python爬虫自学之第(②)篇——BeautifulSoup解析网页

时间:2018-08-24 14:16:18

相关推荐

Python爬虫自学之第(②)篇——BeautifulSoup解析网页

题外话:

《Pi Network 免费挖矿国外热门项目 一个π币大约值3元到10元》相信过去BTC的人,信不信未来的PI,了解一下,唯一一个高度与之持平的项目

学了requests,了解了伪装技巧后,终于能爬到些比较正常的网页源码(html文档)了,但这离结果还差最后和是最重要的一步——筛选。这个过程就像在泥沙中淘金一样,没有合适的筛子,你就会把有价值的漏掉了,或者做了无用功把没用的也筛了出来。

淘金者看土质,做筛子。对应到爬虫领域就是观察html,定制筛选器

稍稍了解HTML

信息都在网页源码里,浏览器通过解析源码来加载我们所看到的东西,那我们是不是也应该学下如何看源码呢?——是的

但不要方,这不是html语法课,做爬虫的,只需了解一下html的原理和标签关系就行了,这跟认亲戚一样简单,你会看家族树的话根本不成问题。

示例html,足以解释所有节点关系。

<head><title>这些有尖括号的叫做标签(或节点),成对存在。<head><title>是标签名,标签间可以放字符串。标签可以拥有属性,属性在尖括号里,如title标签有名为lang的属性,属性值为"en"。A节点被B节点包起来,A就是B的子,或B是A的父。如book和title都是是bookstore的子,但是book是bookstore的直接子(只有一层包含关系)有同一个直接父的标签互相为兄弟,如title,author,year,price互为兄弟。

<title><author></author><year></year><price></price></title>

好了,准备以下代码信息,用来练习获取内容:

from bs4 import BeautifulSoup

from bs4 import BeautifulSoup#准备代码信息,用来练习获取内容html ='''<html><head><title>The Dormouse's story</title></head> <body> <h1><b>123456</b></h1><p class="title" name="dromouse"><b>The Dormouse's story</b>aaaaa</p> <p class="title" name="dromouse" title='new'><b>The Dormouse's story</b>a</p> <p class="story">Once upon a time there were three little sisters; and their names were <a href="/elsie" class="sister" id="link1"><!-- Elsie --></a>, <a href="/lacie" class="sister" id="link2">Lacie</a> and <a href="/tillie" class="sister" id="link3">Tillie</a>;<a href="/tillie" class="siterr" id="link4">Tillie</a>; <a href="/tillie" class="siterr" id="link5">Tillie</a>; and they lived at the bottom of a well.</p> <p class="story">...</p><ul id="ulone"><li>01</li><li>02</li><li>03</li><li>04</li><li>05</li></ul><div class='div11'><ul id="ultwo"><li>0001</li><li>0002</li><li>0003</li><li>0004</li><li>0005</li></ul></div></body> </html>

1.得到beautifulsoup对象

soup = BeautifulSoup(html,'html.parser') #选择解析器

2.获取内容

(1)获取标题对象

print(soup.title)

获取标题文本字符串:

print(soup.title.string) #返回迭代器,出现换行就找不到了print(soup.title.text)print(soup.title.get_text())title = soup.find('title').get_text()print(title)

通过上下级关系获取对象

print(soup.title.parent)print(soup.title.child)print(soup.title.children)

(2)获取第一个p标签

print(soup.p.get_text())print(soup.find('p').text)#获取p的子标签们 (空行也看成了一个children)print(soup.p.children)for i,echo in enumerate(soup.p.children):print(i,echo)

(3)获取标签的属性

#只能找到第一个a标签print('1',soup.a)print('2',soup.a.name)#应该这样写print(soup.a.attrs)print(soup.a.attrs['href'])print(soup.a.attrs['id'])print(soup.a.attrs['class'][0]) #获得的是一个列表,可以用下标查询

(4)获取多个

print(soup.find('p')) #获取一个print(soup.find_all('p')) #获取soup内的p标签 返回一个列表

(5)多层查询

find_all查询返回的是列表,使用下标寻找想要的内容

print(soup.find_all('ul'))print(soup.find_all('ul')[0].find_all('li'))

(6)通过指定的属性,获取对象

print(soup.find(id='ulone')) #单个对象print(soup.find('ul',id='ulone'))print(soup.find_all('ul',id='ulone')) #可以使用下标查询

class是关键字 要这么写class_

print('class1',soup.find_all('p',class_='title'))print('class2',soup.find_all('p',attrs={'class':'title'})) #更通用print('class3',soup.find_all('p',attrs={'class':'title','title':'new'})) #多条件

用函数作为参数,获取元素

def judgeTilte1(t):if t=='title':return Trueprint(soup.find_all(class_=judgeTilte1))

判断长度

import re #正则表达式reg = pile("sis")def judgeTilte2(t):#返回长度为6,且包含'sis'的t参数return len(str(t))==6 and bool(re.search(reg,t))print(soup.find_all(class_=judgeTilte2))

#获取文本内容

# <p class="title" name="dromouse">#<b>The Dormouse's story</b>#aaaaa# </p>print(soup.find('p').text)print(soup.find('p').string) #返回迭代器,出现换行就找不到了<b>,print(soup.find('p').get_text())

获取可以加limit的,限制访问个数

print(soup.find_all('a',limit=2))

recursive = True 寻找子孙 ;recursive = False只找子

print(soup.find_all('body')[0].find_all('ul',recursive = False))

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。