Python之爬取网页时遇到的问题——BeautifulSoup Python之爬取网页时遇到的问题——BeautifulSoup

Python之爬取网页时遇到的问题——BeautifulSoup

https://cuiqingcai.com/1319.html

http://cuiqingcai.com/1319.html , http://blog.csdn.net/akak714/article/details/50130743

http://cuiqingcai.com/1319.html

http://blog.csdn.net/akak714/article/details/50130743

参考地址:Python爬虫入门之BeautifulSoup

【beautifulsoup是用来做什么的】

首先,我们回顾一下beautifulsoup的作用。

我们接触到这个Python模块,是在写Python爬虫脚本时。

用来分析所抓取网页的HTML代码,以方便的从大量的HTML代码中找到我们所需要的数据信息。

比单纯使用正则表达式,方便了许多。

【构造soup对象】

以我们之前写过的诸多代码做基础,构造一个soup对象出来,然后才能够进行解析。

from bs4 import BeautifulSoup

mainUrl="http://www.bilibili.com/online.html"

'''进入在线列表页面'''

resp=urllib2.urlopen(mainUrl)

html = resp.read().decode('utf-8').encode('gbk')

soup = BeautifulSoup(html, "html.parser", from_encoding="gbk")

构造成功。将返回的网页代码构造为一个可以解析的soup对象。

【拿到第一个标签的内容】

我们可以通过指定soup对象的标签,拿到该标签的第一个内容。如:

soup = BeautifulSoup(html, "html.parser", from_encoding="gbk")

print soup.title

打印结果如下:

<title>褰撳墠鍦ㄧ嚎 - 鍝斿摡鍝斿摡寮瑰箷瑙嗛缃� - ( 銈�- 銈�)銇ゃ儹 涔炬澂~ - bilibili</title>

我们发现乱码了,可以将其转换为string类型然后在decode一下

print str(soup.title).decode('utf-8')

打印结果如下:

<title>当前在线 - 哔哩哔哩弹幕视频网 - ( ゜- ゜)つロ 乾杯~ - bilibili</title>

这种soup.tag的方式,只能够拿到html代码中的第一个标签的内容。

【Tag的属性】

每个Tag,都有两个重要的属性,name和attrs

print soup.p

print soup.p.name

print soup.p.attrs

打印出的结果如下:

<p class="etitle">銆愮洏鐐广�戣繎骞村湪B绔欑湅涓嶅埌鐨�8澶у己鐣�</p>

p

{u'class': [u'etitle']}

name,即是标签名

attrs,顾名思义是属性的意思,打印出改tag所具有的属性名以及属性值。

什么算一个标签呢?<p></p>这就算一组标签了,其中再加上class="etitle",这就属于p标签的一个属性,我们还可以给标签添加更多的属性及对应的属性值。

当然,很多标签实际使用时,大多是有属性的。

【获取某标签的某属性值】

我们知道了一个标签可能会有很多个属性,对应也会有很多个属性值。

如果我们想取得确定属性的值。怎么做呢?

print soup.p['class']

直接打印出属性值:[u'etitle']

【获取标签内部的字符串】

使用.string

print str(soup.p).decode('utf-8')

print soup.p.string

打印结果如下:

<p class="etitle">【盘点】近年在B站看不到的8大强番</p>

【盘点】近年在B站看不到的8大强番

我们发现,直接打印p.string,不乱码

【获取标签的所有内容】

直接打印soup.tag只能拿到第一个,接下来我们来拿到所有!

使用soup对象的find_all函数

print soup.find_all('p')

print len(soup.find_all('p'))

打印结果如下:

[<p class="etitle">\u301。。。 bc1\uff1a<span>0910417</span></p>]

45

打印出了所有的p标签内容。共45个p标签。

【find_all函数的使用】

我们可以使用find_all函数找到所有标签,当然也可以根据标签名以及属性来找到我们需要的标签。

这时需要在find_all函数中传递对应参数。

【name参数】

传字符串:

print soup.find_all('p')

传正则表达式:

print soup.find_all(re.compile('^b'))

传递正则表达式时,需要引入Python的re模块。

import re

提供对正则表达式的支持

传列表:

print soup.find_all(['p','head'])

查出p标签和head标签的所有内容。即,同时查多种标签。

当然还可以传别的,这里不再赘述。基本用不到的就不说了。

【keyword函数】

按属性以及属性值来搜索值。

print soup.find_all(class_="ebox")

print len(soup.find_all(class_='ebox'))

打印结果如下:

[<div class="ebox" type><img 。。。。。u5728\u7ebf</p></div>]

20

共20个ebox。

【注意】这里注意,因为class是Python的关键词,所以在class后加下划线

这里虽然能够找出来,但find_all函数有一个问题,就是中文编码。

我们之前使用find_all函数寻找所需要的数据的时候,中文总是乱码。find_all这个函数会把查出来的字符串搞乱,所以是有一定局限性的。

甚至最终我们都没有使用find_all函数!

【CSS选择器】

我们最终决定使用的是soup.select函数,又叫CSS选择器。

我们使用CSS选择器来寻找符合要求的数据。

soup.select()找到的数据,返回为list类型,即,寻找到的是所有符合要求的数据。

查找方式如下:

【通过标签名查找】

print soup.select('div')

直接返回所有div标签的所有内容

【通过类名查找】

print soup.select('.ebox')

print len(soup.select('.ebox'))

. 这个点表示查询class="ebox"的,所有标签内容

可以查询出20条数据。

【通过id名查找】

————————————————

版权声明:本文为CSDN博主「AKAK714」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/akak714/java/article/details/50130743

记下两个与本文内容不太相关的知识点。

import re 对正则表达式支持的包。

str(soup.p).decode('utf-8') 对标签内容转码。

Beautiful Soup 是用Python写的一个HTML/XML的解析器,它可以很好的处理不规范标记并生成剖析树。 它提供简单又常用的导航,搜索以及修改剖析树的操作。它可以大大节省你的编程时间。

通俗的来说,就是在

req = urllib2.Request(url, headers=headers)

page = urllib2.urlopen(req, timeout=60)

contents = page.read()

之后,对contents进行解析 soup = BeautifulSoup(contents, 'html.parser'),这样构建的是Python标准库,然后我们便可以对这个soup对象进行一系列的操作,提取我们所需要的元素。

我们对用法进行一下解释:

soup.title 得到的是<title>标签,以及标签里的内容。但是得到的是所有<title>标签中的第一个。<title>这里是内容</title>,红字部分。

soup.title.name 得到的是<title>标签的name属性的值。得到的是所有<title>标签中的第一个。

soup.title.string 得到的是<title>开始和结束标签之间的值。<title>这里是内容</title>,即红字部分。得到的是所有<title>标签中的第一个。

soup.find_all('title') 得到所有标签为<title>的的标签,以及标签里的内容。返回的是一个序列,可以对它循环,得到自己想要的东西。

soup.find() 得到id为3的标签。

soup.p.get_text() 返回的是<p>标签的文本。

soup.a['href'] 返回<a>标签的 herf 值 。

soup.head.contents 获得head下的所有子孩子。以列表的形式返回结果,可以使用 [num] 的形式获得 。获得标签,使用.name 就可以。

print soup.find_all(text="Elsie") 获得文本为Elsie的标签。

print soup.find_all("a", limit=2) 返回两个<a>标签。

string属性,如果超过一个标签的话,那么就会返回None,否则就返回第一个标签的string。超过一个标签的话,可以试用strings。

获取标签的孩子,可以使用children,但是不能print soup.head.children,没有返回列表,返回的是 <listiterator object at 0x108e6d150>,不过使用list可以将其转化为列表。可以使用for 语句遍历里面的孩子。

向上查找可以用parent函数,如果查找所有的,那么可以使用parents函数。

查找下一个兄弟使用next_sibling,查找上一个兄弟节点使用previous_sibling,如果是查找所有的,那么在对应的函数后面加s就可以。

soup.select()找到的数据,返回为list类型,即,寻找到的是所有符合要求的数据。

soup.select('div') 直接返回所有div标签的所有内容

soup.select('.ebox') . 这个点表示查询class="ebox"的,所有标签内容。

len(soup.select('.ebox')) 可以查询出20条数据。

soup.select('#index_nav') 查找所有id为 index_nav 的标签。

soup.select('div #index_nav') 表示寻找div标签中id为index_nav的标签内容。

soup.select('p[class="etitle"]') 查找所有class为etitle的<p>标签。

http://cuiqingcai.com/1319.html , http://blog.csdn.net/akak714/article/details/50130743 这两个网址可以学习一下。

https://cuiqingcai.com/1319.html

http://cuiqingcai.com/1319.html , http://blog.csdn.net/akak714/article/details/50130743

http://cuiqingcai.com/1319.html

http://blog.csdn.net/akak714/article/details/50130743

参考地址:Python爬虫入门之BeautifulSoup

【beautifulsoup是用来做什么的】

首先,我们回顾一下beautifulsoup的作用。

我们接触到这个Python模块,是在写Python爬虫脚本时。

用来分析所抓取网页的HTML代码,以方便的从大量的HTML代码中找到我们所需要的数据信息。

比单纯使用正则表达式,方便了许多。

【构造soup对象】

以我们之前写过的诸多代码做基础,构造一个soup对象出来,然后才能够进行解析。

from bs4 import BeautifulSoup

mainUrl="http://www.bilibili.com/online.html"

'''进入在线列表页面'''

resp=urllib2.urlopen(mainUrl)

html = resp.read().decode('utf-8').encode('gbk')

soup = BeautifulSoup(html, "html.parser", from_encoding="gbk")

构造成功。将返回的网页代码构造为一个可以解析的soup对象。

【拿到第一个标签的内容】

我们可以通过指定soup对象的标签,拿到该标签的第一个内容。如:

soup = BeautifulSoup(html, "html.parser", from_encoding="gbk")

print soup.title

打印结果如下:

<title>褰撳墠鍦ㄧ嚎 - 鍝斿摡鍝斿摡寮瑰箷瑙嗛缃� - ( 銈�- 銈�)銇ゃ儹 涔炬澂~ - bilibili</title>

我们发现乱码了,可以将其转换为string类型然后在decode一下

print str(soup.title).decode('utf-8')

打印结果如下:

<title>当前在线 - 哔哩哔哩弹幕视频网 - ( ゜- ゜)つロ 乾杯~ - bilibili</title>

这种soup.tag的方式,只能够拿到html代码中的第一个标签的内容。

【Tag的属性】

每个Tag,都有两个重要的属性,name和attrs

print soup.p

print soup.p.name

print soup.p.attrs

打印出的结果如下:

<p class="etitle">銆愮洏鐐广�戣繎骞村湪B绔欑湅涓嶅埌鐨�8澶у己鐣�</p>

p

{u'class': [u'etitle']}

name,即是标签名

attrs,顾名思义是属性的意思,打印出改tag所具有的属性名以及属性值。

什么算一个标签呢?<p></p>这就算一组标签了,其中再加上class="etitle",这就属于p标签的一个属性,我们还可以给标签添加更多的属性及对应的属性值。

当然,很多标签实际使用时,大多是有属性的。

【获取某标签的某属性值】

我们知道了一个标签可能会有很多个属性,对应也会有很多个属性值。

如果我们想取得确定属性的值。怎么做呢?

print soup.p['class']

直接打印出属性值:[u'etitle']

【获取标签内部的字符串】

使用.string

print str(soup.p).decode('utf-8')

print soup.p.string

打印结果如下:

<p class="etitle">【盘点】近年在B站看不到的8大强番</p>

【盘点】近年在B站看不到的8大强番

我们发现,直接打印p.string,不乱码

【获取标签的所有内容】

直接打印soup.tag只能拿到第一个,接下来我们来拿到所有!

使用soup对象的find_all函数

print soup.find_all('p')

print len(soup.find_all('p'))

打印结果如下:

[<p class="etitle">\u301。。。 bc1\uff1a<span>0910417</span></p>]

45

打印出了所有的p标签内容。共45个p标签。

【find_all函数的使用】

我们可以使用find_all函数找到所有标签,当然也可以根据标签名以及属性来找到我们需要的标签。

这时需要在find_all函数中传递对应参数。

【name参数】

传字符串:

print soup.find_all('p')

传正则表达式:

print soup.find_all(re.compile('^b'))

传递正则表达式时,需要引入Python的re模块。

import re

提供对正则表达式的支持

传列表:

print soup.find_all(['p','head'])

查出p标签和head标签的所有内容。即,同时查多种标签。

当然还可以传别的,这里不再赘述。基本用不到的就不说了。

【keyword函数】

按属性以及属性值来搜索值。

print soup.find_all(class_="ebox")

print len(soup.find_all(class_='ebox'))

打印结果如下:

[<div class="ebox" type><img 。。。。。u5728\u7ebf</p></div>]

20

共20个ebox。

【注意】这里注意,因为class是Python的关键词,所以在class后加下划线

这里虽然能够找出来,但find_all函数有一个问题,就是中文编码。

我们之前使用find_all函数寻找所需要的数据的时候,中文总是乱码。find_all这个函数会把查出来的字符串搞乱,所以是有一定局限性的。

甚至最终我们都没有使用find_all函数!

【CSS选择器】

我们最终决定使用的是soup.select函数,又叫CSS选择器。

我们使用CSS选择器来寻找符合要求的数据。

soup.select()找到的数据,返回为list类型,即,寻找到的是所有符合要求的数据。

查找方式如下:

【通过标签名查找】

print soup.select('div')

直接返回所有div标签的所有内容

【通过类名查找】

print soup.select('.ebox')

print len(soup.select('.ebox'))

. 这个点表示查询class="ebox"的,所有标签内容

可以查询出20条数据。

【通过id名查找】

————————————————

版权声明:本文为CSDN博主「AKAK714」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/akak714/java/article/details/50130743

记下两个与本文内容不太相关的知识点。

import re 对正则表达式支持的包。

str(soup.p).decode('utf-8') 对标签内容转码。

Beautiful Soup 是用Python写的一个HTML/XML的解析器,它可以很好的处理不规范标记并生成剖析树。 它提供简单又常用的导航,搜索以及修改剖析树的操作。它可以大大节省你的编程时间。

通俗的来说,就是在

req = urllib2.Request(url, headers=headers)

page = urllib2.urlopen(req, timeout=60)

contents = page.read()

之后,对contents进行解析 soup = BeautifulSoup(contents, 'html.parser'),这样构建的是Python标准库,然后我们便可以对这个soup对象进行一系列的操作,提取我们所需要的元素。

我们对用法进行一下解释:

soup.title 得到的是<title>标签,以及标签里的内容。但是得到的是所有<title>标签中的第一个。<title>这里是内容</title>,红字部分。

soup.title.name 得到的是<title>标签的name属性的值。得到的是所有<title>标签中的第一个。

soup.title.string 得到的是<title>开始和结束标签之间的值。<title>这里是内容</title>,即红字部分。得到的是所有<title>标签中的第一个。

soup.find_all('title') 得到所有标签为<title>的的标签,以及标签里的内容。返回的是一个序列,可以对它循环,得到自己想要的东西。

soup.find() 得到id为3的标签。

soup.p.get_text() 返回的是<p>标签的文本。

soup.a['href'] 返回<a>标签的 herf 值 。

soup.head.contents 获得head下的所有子孩子。以列表的形式返回结果,可以使用 [num] 的形式获得 。获得标签,使用.name 就可以。

print soup.find_all(text="Elsie") 获得文本为Elsie的标签。

print soup.find_all("a", limit=2) 返回两个<a>标签。

string属性,如果超过一个标签的话,那么就会返回None,否则就返回第一个标签的string。超过一个标签的话,可以试用strings。

获取标签的孩子,可以使用children,但是不能print soup.head.children,没有返回列表,返回的是 <listiterator object at 0x108e6d150>,不过使用list可以将其转化为列表。可以使用for 语句遍历里面的孩子。

向上查找可以用parent函数,如果查找所有的,那么可以使用parents函数。

查找下一个兄弟使用next_sibling,查找上一个兄弟节点使用previous_sibling,如果是查找所有的,那么在对应的函数后面加s就可以。

soup.select()找到的数据,返回为list类型,即,寻找到的是所有符合要求的数据。

soup.select('div') 直接返回所有div标签的所有内容

soup.select('.ebox') . 这个点表示查询class="ebox"的,所有标签内容。

len(soup.select('.ebox')) 可以查询出20条数据。

soup.select('#index_nav') 查找所有id为 index_nav 的标签。

soup.select('div #index_nav') 表示寻找div标签中id为index_nav的标签内容。

soup.select('p[class="etitle"]') 查找所有class为etitle的<p>标签。

http://cuiqingcai.com/1319.html , http://blog.csdn.net/akak714/article/details/50130743 这两个网址可以学习一下。