Type "a" or "b": a got input: None 我不明白为什么 get_input() 函数返回的是 None,因为它本应只返回 my_var。这个 None 是从哪里来的?...我该如何修复我的函数呢? 答: 它返回 None 是因为当你递归调用它时: if my_var != "a" and my_var !...get_input() .. 没有返回那个值。 因此,尽管递归确实发生了,但返回值却被丢弃了,然后你会从函数末尾退出。...在函数末尾退出意味着 Python 会隐式地返回 None,就像下面这样: >>> def f(x): ......Python3 documentation 因此,除了在 if 语句中调用 get_input() 之外,还需要返回递归调用返回的内容。
与其内部的title节点内容时,数据类型均为"bs4.element.Tag" # 说明在tag类型的基础上可以获取当前节点的子节点内容,即嵌套选择。..., attrs={}, recursive=True, text=None, **kwargs) name: 指定节点名称,并返回符合条件的第一个内容 attrs: 通过指定属性进行数据的获取工作,可直接填写字典类型的参数...---- find_all()--获取所有符合条件的内容 soup.find_all(name=None, attrs={}, recursive=True, text=None, **kwargs)...name: 指定节点名称,返回一个可迭代对象,所有符合条件的内容均为对象中的一个元素。...p节点中第一个节点内value属性对应的值(两种方式) soup.select('p')[0].get_text()soup.select('p')[0].string 获取所有p节点中第一个节点内文本
() 构造一个请求 requests.get() 获取HTML网页的主要方法 requests.head() 获取HTML的头信息 requests.post() 向HTML提交POST import...,为什么能在关键时刻挽救人的生命?...' 标签的属性 对于标签,有两个重要的属性,name和attrs >>> tag = soup.a >>> type(tag) # bs4.element.Tag bs4.element.Tag...,返回一个list .children**:**获取Tag的所有子节点,返回一个生成器 .parent:获取Tag的父节点 .parents:递归得到父辈元素的所有节点,返回一个生成器 .next_sibling...print(link.get('href')) ...
关于爬虫的案例和方法,我们已讲过许多。不过在以往的文章中,大多是关注在如何把网页上的内容抓取下来。今天我们来分享下,当你已经把内容爬下来之后,如何提取出其中你需要的具体信息。...bs 对象->通过 find/find_all 或其他方法检测信息->输出或保存 可以迭代式的查找,比如先定位出一段内容,再其上继续检索 开发时应注意不同方法的返回类型,出错时多看报错、多加输出信息...bs4.element.Tag 对象,这个对象可以进一步进行搜索。...如果有多个满足的结果,find只返回第一个;如果没有,返回 None。...find_all 返回的是一个由 bs4.element.Tag 对象组成的 list,不管找到几个或是没找到,都是 list。
B/S 结构,文本、图片等信息在请求到达之前即通过 HTML 语言以静态网页形式存储在 Web 服务器上,HTTP 请求到达后,Web 服务器把网页发给客户端的浏览器进行响应,属于静态网页技术。...#输出找到的元素类型,是bs4.element.Tag类型 print(type(first_p)) #输出找到的元素的属性,是一个字典 first_p.attrs 运行结果: bs4...(self, name=None attrs=f, recursive=True, text=None, limit=None, **kwargs) self表明它是一个类成员函数; name是要查找的...,默认是True; 后面的text、limit、kwargs参数比较复杂,将在后面用到时介绍; find_all函数返回查找到的所有指定的元素的列表,每个元素是一个 bs4.element.Tag对象...URL link_url=a_tag.get('href') print("Link URL:", link_url) # 获取超链接文本 link_text=a_tag.get_text() print
bs 对象->通过 find/find_all 或其他方法检测信息->输出或保存 可以迭代式的查找,比如先定位出一段内容,再其上继续检索 开发时应注意不同方法的返回类型,出错时多看报错、多加输出信息.../a find 和 find_all 可以有多个搜索条件叠加,比如find('a', id='link3', class_='sister') find 返回的是一个bs4.element.Tag 对象...如果有多个满足的结果,find只返回第一个;如果没有,返回 None。...find_all 返回的是一个由 bs4.element.Tag 对象组成的 list,不管找到几个或是没找到,都是 list。...输出: x = soup.find(class_='story')x.get_text() # 仅可见文本内容# 'Once upon a time there were three little sisters
1、Tag 的使用: 可以利用beautifulsoup4对象加标签名 轻松地获取这些标签的内容,这些对象的类 bs4.element.Tag。...#获取第一个符合条件的标签的属性 soup.a.get('href') 二者等价,返回结果均为:'http://www.taobao.com' soup.a.attrs #输出a标签的全部属性,..., 例1: print(type(p.parent)) #bs4.element.Tag'> print(p.parent) 8.parents: 递归得到父辈元素的所有节点,返回一个生成器...[s.extract() for s in soup(['script','fram']) ] 5、获取内容:get_text()、strings属性 get_text()方法:返回的是列表。...并且若标 签内部没有文本 string 属性返回的是None ,而text属性不会返回None 3、Comment 的使用: 介绍:在网页中的注释以及特殊字符串。
, 'lxml') print(soup.title) # Beautiful Soup test print(type(soup.title)) # bs4...In [28]: import re # 返回所有匹配正则的节点文本组成的列表 In [29]: soup.find_all(text=re.compile('ar')) Out[29]: ['Bar...', 'Bar'] find 返回第一个匹配的元素 In [30]: soup.find(text=re.compile('ar')) Out[30]: 'Bar' In [31]: soup.find...Text:', li.get_text()) ...: print('String:', li.string) ...: ...: Get Text: Foo String...: Foo Get Text: Bar String: Bar Get Text: Jay String: Jay Get Text: Foo String: Foo Get Text: Bar String
解析器 Beautiful Soup 在解析时实际上依赖解析器,它除了支持 Python 标准库中的 HTML 解析器外,还支持一些第三方解析器(比如 lxml)。...然后调用 soup.title.string,这实际上是输出 HTML 中 title 节点的文本内容。...嵌套选择 在上面的例子中,我们知道每一个返回结果都是 bs4.element.Tag 类型,它同样可以继续调用节点进行下一步的选择。...也就是说,我们在 Tag 类型的基础上再次选择得到的依然还是 Tag 类型,每次返回的结果都相同,所以这样就可以做嵌套选择了。 最后,输出它的 string 属性,也就是节点里的文本内容。...Get Text: Bar String: Bar 二者的效果是完全一致的,都可以获取到节点的文本值。
可以自动更正格式,这一步实际上不是由 prettify() 方法做的,这个更正实际上在初始化 BeautifulSoup 时就完成了。...然后我们调用了 soup.title.string ,这个实际上是输出了 HTML 中 title 节点的文本内容。...嵌套选择 在上面的例子中我们知道每一个返回结果都是 bs4.element.Tag 类型,它同样可以继续调用节点进行下一步的选择,比如我们获取了 head 节点元素,我们可以继续调用 head 来选取其内部的...bs4.element.Tag 类型,也就是说我们在 Tag 类型的基础上再次选择得到的依然还是 Tag 类型,每次返回的结果都相同,所以这样我们就可以这样做嵌套的选择了。...) 方法,传入了一个 name 参数,参数值为 ul,也就是说我们想要查询所有 ul 节点,返回结果是列表类型,长度为 2,每个元素依然都是 bs4.element.Tag 类型。
可以自动更正格式,这一步实际上不是由prettify()方法做的,这个更正实际上在初始化BeautifulSoup时就完成了。...然后我们调用了soup.title.string,这个实际上是输出了HTML中标签的文本内容。...嵌套选择 在上面的例子中我们知道每一个返回结果都是bs4.element.Tag类型,它同样可以继续调用标签进行下一步的选择,比如我们获取了head节点元素,我们可以继续调用head来选取其内部的head...bs4.element.Tag类型,也就是说我们在Tag类型的基础上再次选择得到的依然还是Tag类型,每次返回的结果都相同,所以这样我们就可以这样做嵌套的选择了。...String: Bar Get Text: Jay String: Jay Get Text: Foo String: Foo Get Text: Bar String: Bar 二者的效果是完全一致的
web_html = soup.prettify() # 返回格式化后的源码,str类型 title_tag = soup.title # 返回源码中第一个title标签(源码),element.Tag...element.NavigableString,下面有多个标签内容则返回None print('title_content:', title_content, type(title_content))...type(all_p_content)) a_href = soup.a['href'] # 提取第一个a标签的href属性,str类型 print("a_href:", a_href, type(a_href...('href') # 获取该对象的属性href find_attrs_result.text # 获取该对象标签的文本,不同于find_attrs_result.string,下面有多个标签会全部返回而不是...response.text soup = BeautifulSoup(web_html, 'lxml') # 解析网页源码创建Beautifulsoup对象 4.对象类型介绍 BeautifulSoup4四大对象种类 bs4
代表html文档中的标签,Tag对象可以包含其他多个Tag对象。Tag.name返回标签名,Tag.string返回标签中的文本。...) #返回一个字典,里面是多有属性和值 print(soup.div.p.attrs) #查看返回的数据类型 print(type(soup.div.p)) #根据属性,获取标签的属性值,返回值为列表...find_all(self, name=None, attrs={}, recursive=True, string=None, **kwargs) name 参数对应tag名称,如soup.find_all...limit:由于 find_all() 会返回所有的搜索结果,这样会影响执行效率,通过 limit 参数可以限制返回结果的数量 find()函数是find_all()的一种特例,仅返回一个值。...None,而 find_all() 方法返回空列表。
钢铁知识库,一个学习python爬虫、数据分析的知识库。人生苦短,快用python。 上一章我们讲解针对结构化的html、xml数据,使用Xpath实现网页内容爬取。...接下来输出它的类型,是一个bs4.element.Tag类型,Tag具有一些属性,比如string。 调用string属性可以看到输出节点的文本内容。 继续尝试head、p节点。...'] ''' 但是注意区分:有的返回字符串、有的返回字符串组成的列表。....element.Tag'> ''' 可以看到返回了一个列表,分别是两个ul长度为2,且类型依然是bs4.element.Tag类型。...find_all_next 和 find_next:前者返回节点后所有符合条件的节点,后者返回第一个符合条件的节点。
球员数据的Web请求是http://soccerdata.sports.qq.com/playerSearch.aspx?lega=epl&pn=2 ,返回的内容如下图所示: ?...item.string.strip() or 'na') try: o = urlparse.urlparse(item.a['href...(url) 我们来看看抓取球员数据的详细过程: 首先我们定义了一个get_players方法,该方法会返回某一请求页面上所有球员的数据。...record.append(unicode(query["teamid"],'utf-8')) record.append(unicode(query["lega"],'utf-8')) 最后我们把本页面所有球员的列表放入一个列表返回...import csv def write_csv(filename, content, header = None): file = open(filename, "wb") file.write
我们可以利用 soup 加标签名轻松地获取这些标签的内容,这些对象的类型是bs4.element.Tag。但是注意,它查找的是在所有内容中的第一个符合要求的标签。...他们两的区别是:contents返回来的是一个列表,children返回的是一个迭代器。...get_text:获取某个标签下的子孙非标签字符串,以普通字符串形式返回 from bs4 import BeautifulSoup html = """ The...,如果有多个文本或标签返回None----->None # print(soup.p.text) # 当前标签和子子孙的文本内容拼到一起 ----->HammerZeThe Dormouse's...,然后用 get_text() 方法来获取它的内容。
球员数据的Web请求是http://soccerdata.sports.qq.com/playerSearch.aspx?lega=epl&pn=2 ,返回的内容如下图所示: ?...item.string.strip() or 'na') try: o = urlparse.urlparse(item.a['href...(url) 我们来看看抓取球员数据的详细过程: 首先我们定义了一个get_players方法,该方法会返回某一请求页面上所有球员的数据。...record.append(unicode(query["teamid"],'utf-8')) record.append(unicode(query["lega"],'utf-8')) 最后我们把本页面所有球员的列表放入一个列表返回...import csvdef write_csv(filename, content, header = None): file = open(filename, "wb") file.write
BS4全称是Beatiful Soup,官方文档[1]它提供一些简单的、python式的函数用来处理导航、搜索、修改分析树等功能。...-- Elsie -->, href="http://example.com/lacie" class="sister" id="link2">Lacie and href=...li class="element">Foo Bar Jay bs4....element.Tag'> None 方法 描述 prettify 格式化html代码 find_parents() 返回所有祖先节点 find_parent() 返回直接父节点 find_next_siblings...() 返回前面第一个兄弟节点 find_all_next() 返回节点 find_next() 返回第一个符合条件的节点 find_all_previous() 返回节点 find_previous()
.element.Tag'> 我们可以利用 soup 加标签名轻松地获取这些标签的内容,这些对象的类型是bs4.element.Tag。...返回来的 是个生成器。 get_ _text:获取某个标签下的子孙非标签字符串。不是以列表的形式返回,是以普通字 符串返回。...find方法是找到第一个满足条件的标签后就立即返回,只返回一个元素。find_all方法是把所有满足条件的标签都选到,然后返回回去。...示例代码如下: print(soup.select('a[href="http://example.com/elsie"]')) (6)获取内容 以上的 select 方法返回的结果都是列表形式,可以遍历形式输出...,然后用 get_text() 方法来获取它的内容。
领取专属 10元无门槛券
手把手带您无忧上云