赞
踩
目录
2.1.1 BeautifulSoup_object.find()抽取标签方法
2.1.2 BeautifulSoup_object.find_all()抽取标签方法
2.1.3 BeautifulSoup.select()抽取标签方法
2.1.4 BeautifulSoup_object获取标签文本、属性值方法
2.1.5 BeautifulSoup_object获取同级标签(兄弟节点)方法
2.1.6 BeautifulSoup_object获取子孙、祖先节点
2.1.7 BeautifulSoup_object节点的删除、插入和替换方法
方法:urllib.request.Request(url, data=None, headers={}, origin_req_host=None, unverificable=False, method=None)
headers: 请求头,字典类型。用来伪装浏览器,默认是User-Agent python-urllib。也可伪装火狐浏览器,
headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'}
method:'GET', 'POST', 'PUT'
- # 访问、下载html网页
- url = 'https://baike.baidu.com/item/' + urllib.parse.quote(content) # 请求地址
- # 请求头部,伪造浏览器,防止爬虫被反
- headers = {
- 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'
- }
- # 利用请求地址和请求头部构造请求对象
- req = urllib.request.Request(url=url, headers=headers, method='GET')
- response = urllib.request.urlopen(req) # 发送请求,获得响应
- text = response.read().decode('utf-8') # 读取响应,获得文本
模块urllib和urllib2的功能差不多,简单来说urllib2是urllib的增强——urllib2更好一些,但是urllib中有urllib2中所没有的函数。对于简单的下载, urllib绰绰有余。 如果需要实现HTTP身份验证或Cookie亦或编写扩展来处理自己的协议,urllib2可能是更好的选择。在Python2.x中主要为urllib和urllib2,这两个标准库是不可相互替代的。但是在Python3.x中将urllib2合并到了urllib,这一点值得注意。
————————————————
版权声明:本文为CSDN博主「IoneFine」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/jiduochou963/article/details/87564467
urllib.parse.quote(content) Failed to establish a new connection: [Errno 61] Connection refused')
原因:服务器没启动!手动滑稽。。。。
Requests是用python编写的,基于urllib,采用Apache2 Licensed开源协议的http库。它比url更方便。它支持python3
requests.obj.json()出现错误
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
原因:当我们在爬取一些网页时,有些网页的内容是通过Unicode字符编码进行传输的,
解决:
比如爬虫解码法:
1 import requests 2 3 reps = requests.get(url=url) 4 reps.content.decode("utf-8") 5 #或者使用这条语句 reps.content.decode("unicode_escape")
中文官方文档:Beautiful Soup 4.12.0 文档 — Beautiful Soup 4.12.0 documentation
BS4,全称是Beautiful Soup,它提供一些简单的、python式的函数用来处理导航、搜索、修改分析树等功能。
它是一个工具箱,通过解析文档为soup自动将输入文档转换为unicode编码,输出文档转换为utf-8编码
BeautifulSoup对象声明方法:字符串、在线网页、html文件
将bs4.element.Tag转换成字符串:使用
str()
进行强制转换(Python真香!)将字符串str转换成bs4.element.Tag,需要以字符串形式用BeautifulSoup重新声明
# br_soup = BeautifulSoup(str(br), 'lxml')
# print(type(br_soup))
source:Python爬虫:如何创建BeautifulSoup对象_beautifulsoup c++-CSDN博客
- html = '<div>text1</div>'
- html = urlopen("http://www.pythonscraping.com/pages/page3.html")
- html = open('c:\\aa.html')
-
- #以上三行表示了HTML的三种来源,一是字符串形式,二是在线网页形式,三是HTML文件形式
-
- bsObj = BeautifulSoup(html, 'html.parser') # 'html.parser'是解析器,也可以用'lxml'
- # BeautifulSoup类似于C++中的构造函数
- e = bsObj.find('div')
- print(e.text)
find()方法只返回当前标签下的第一个匹配子标签,返回一个tag标签。
find_all()方法返回当前标签下的所有匹配子标签的结果,返回一个标签列表。如,
title = soup.find_all('div', class_='basicInfo_item name')
--> 注意:只有class属性名要有class_这个下横线
find_all()方法支持嵌套查询,不仅bs4对象可以调用,而且tag标签也可以调用。
- for ul in soup.find_all(name = 'ul'):
- print(ul.find_all(name='li'))
find_all(name, attrs, recursive, text, **kwargs)
- # 读取响应,获得文本
- text = response.read().decode('utf-8')
- # 解析html网页
- soup = BeautifulSoup(text, 'lxml') # 创建soup对象,获取html源码
-
- intro_tag = soup.find_all('div', class_="lemma-summary") # 获取百科基本信息列表
- name_tag = soup.find_all('dt', class_="basicInfo-item name") # 找到所有dt标签,返回一个标签列表
- value_tag = soup.find_all('dd', class_="basicInfo-item value") # 找到所有dd标签,返回一个标签列表
select()方法返回类型的标签列表
如:soup.select('a[href='http://example.com.elsie']'),属性查找也可用于组合查找
- <a class= "lemma-album layout-right nslog: 10000206" href= "url"> hello, world
- <img class= "picture" src= "url">
- </img>
- </a>
-->BeautifulSoup如何获取不包含子节点文本的文本?
contents属性返回当天标签的直接子节点,返回结果时列表形式,你可以根据索引索取你想要的标签节点或文本。
- # contents返回的结果列表
- [<span class="title-prefix">潘建伟</span>, '人物履历']
- print(i.find(class_='title-text').contents[1])
- sibling_soup = BeautifulSoup(sibling_html, 'html.parser')
- br = sibling_soup.p
- while br.next_sibling != None:
- print br
- br = br.next_sibling
- ---------------------------------------------------------------
- for tag in soup.select('div .col-md-4'):
- if tag.get_text() == 'Total':
- result = tag.next_sibling.get_text()
-
--> 判断each br in 返回的兄弟标签列表是否是标签,因为有些兄弟节点为空。
- for br in i.next_siblings: # 获取人物履历标签后面所有的兄弟标签
- # print(br)
- if type(br) is bs4.element.Tag: # 判断br是不是一个标签
- attrs = ''.join(br.attrs['class'])
- if attrs == 'para':
- br_text_list.append(br.get_text())
- elif attrs == re.compile('para-title level'):
- break
- else:
- continue
参考:beautifulsoup中文官方文档,Beautiful Soup 4.12.0 文档 — Beautiful Soup 4.12.0 documentation
Tag.clear()
方法移除当前tag的内容:- markup = '<a href="http://example.com/">I linked to <i>example.com</i></a>'
- soup = BeautifulSoup(markup)
- tag = soup.a
-
- tag.clear()
- tag
- # <a href="http://example.com/"></a>
PageElement.extract()
方法将当前tag移除文档树,并作为方法结果返回:- markup = '<a href="http://example.com/">I linked to <i>example.com</i></a>'
- soup = BeautifulSoup(markup)
- a_tag = soup.a
-
- i_tag = soup.i.extract()
-
- a_tag
- # <a href="http://example.com/">I linked to</a>
-
- i_tag
- # <i>example.com</i>
-
- print(i_tag.parent)
- None
这个方法实际上产生了2个文档树: 一个是用来解析原始文档的 BeautifulSoup
对象,另一个是被移除并且返回的tag.被移除并返回的tag可以继续调用 extract
方法:
Tag.decompose()
方法将当前节点移除文档树并完全销毁:- markup = '<a href="http://example.com/">I linked to <i>example.com</i></a>'
- soup = BeautifulSoup(markup)
- a_tag = soup.a
-
- soup.i.decompose()
-
- a_tag
- # <a href="http://example.com/">I linked to</a>
PageElement.replace_with()
方法移除文档树中的某段内容,并用新tag或文本节点替代它:
- markup = '<a href="http://example.com/">I linked to <i>example.com</i></a>'
- soup = BeautifulSoup(markup)
- a_tag = soup.a
-
- new_tag = soup.new_tag("b")
- new_tag.string = "example.net"
- a_tag.i.replace_with(new_tag)
-
- a_tag
- # <a href="http://example.com/">I linked to <b>example.net</b></a>
replace_with()
方法返回被替代的tag或文本节点,可以用来浏览或添加到文档树其它地方
bs4.FeatureNotFound: Couldn't find a tree builder with the features you requested: lxml. Do you need to install a parser library?
原因:不可以使用 BeautifulSoup(html,'lxml'),没有安装lxml导致bs4不能使用lxml解决:pip3 install lxml
/ -->类似于find(),// -->类似于find_all(),后面跟标签名,[@ ] --> @后面跟属性名
- # class属性抽取标签 + 提取标签href属性值
- link_list = html_et.xpath('//div[@class="main-content"]//a/@href')
-
- # class属性抽取标签 + 提取标签文本text
- text_list = html_et.xpath('//div[@class="lemma-summary"]//text()')
-
- # 模糊定位starts-with方法
- ele = etree.xpath("//input[starts-with(@class, "tag")]") # 获得class= tagyou
-
- # 模糊定位ends-with方法
- ele = etree.xpath("//input[ends-with(@class, "tag")]") # 获得class= youtag
-
- # 模糊定位contains方法
- ele = etree.xpath("//input[contains(@class, "tag")]") # 获得class= youtagyou
-
- # 模糊定位-使用任意值来匹配属性元素
- ele = etree.xpath("//input[@*="tag"]")
-
- # 使用索引定位元素
- ele = etree.xpath("/a/b/input[4]")
-
- # 因为索引定位可能出现元素变动,如:input[4], input[3],所以使用last()最后一个元素索引定位
- ele = etree.xpath("/a/b/input[last()]")
--> html网页源码的字符编码(charset)格式包括:GB2312, GBK, UTF-8, IOS8859-1等。
- # 读取响应,获得文本
- text = response.read().decode('utf-8')
- # 构造 _Element 对象
- html = etree.HTML(text)
- # 使用 xpath 匹配数据,得到匹配字符串列表
- sen_list = html.xpath('//div[contains(@class,"lemma-summary")]//text()')
- # sen_list = html.xpath('//div[@class="lemma-summary"]//text()')
- # 过滤数据,去掉空白
- sen_list_after_filter = [item.strip('\n') for item in sen_list if item != '\n']
- # 将字符串列表连成字符串并返回
- return ''.join(sen_list_after_filter)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。