代码如下:
import requests
from bs4 import BeautifulSoup
import jsondef download_all_htmls():"""下载所有列表页面的HTML,用于后续的分析"""htmls = [] #列表for idx in range(34): #一共34页url = f"/{idx+1}" #自动爬取所有页面print("craw html:", url)r = (url) #发送GET请求,返回的是一个包含服务器资源的Response对象if r.status_code != 200: #状态码为200则表示服务器已成功处理了请求raise Exception("error")htmls.)return htmlshtmls = download_all_htmls()def parse_single_html(html):"""解析单个HTML,得到数据@return list({"link", "title", [label]})"""soup = BeautifulSoup(html, 'html.parser') #解析html字符串,html.parser表示解析用的解析器articles = soup.find_all("article") #找到article标签,文章的标题和超链接都在article标签里面,find_all()返回的是一个列表datas = [] #存放数据的列表for article in articles:# 查找超链接title_node = (article.find("h2", class_="entry-title").find("a"))title = _text() #标题link = title_node["href"] #超链接# 查找标签列表tag_nodes = (article.find("span", class_="cat-links").find_all("a") #find_all()返回一个列表) tags = [_text() for tag_node in tag_nodes]datas.append({"title": title, "link": link, "tags": tags} #将字典存入列表)return datasall_datas = []
for html in htmls:d(parse_single_html(html)) #extend() 函数用于在列表末尾一次性追加另一个序列中的多个值with open("all_article_links.json", "w",encoding='utf-8') as f:for data in all_datas:f.write(json.dumps(data, ensure_ascii=False)+"n")
将一段文档传入BeautifulSoup 的构造方法,就能得到一个文档的对象, 可以传入一段字符串或一个文件句柄。首先,文档被转换成Unicode,并且HTML的实例都被转换成Unicode编码。然后,Beautiful Soup选择最合适的解析器来解析这段文档,如果手动指定解析器那么Beautiful Soup会选择指定的解析器来解析文档。
Python标准库中的HTML解析器:BeautifulSoup(markup, “html.parser”):
lxml HTML 解析器:BeautifulSoup(markup, “lxml”) pycharm中先安装wheel库,再安装lxml库
lxml XML 解析器:BeautifulSoup(markup, [“lxml-xml”])
BeautifulSoup(markup, “xml”)
html5lib解析器:BeautifulSoup(markup, “html5lib”) html5lib的解析方式与浏览器相同,生成HTML5格式的文档
输出解析后的文档:
from bs4 import BeautifulSoup
doc = "<html><h1>Heading</h1><p>Text"
soup = BeautifulSoup(doc,'lxml')
print(str(soup)) #使用 str函数将Beautiful Soup文档(或者它的子集)转换为字符串
print(soup.prettify()) #prettify()函数添加了一些换行和空格以便让文档结构看起来更清晰
print(unicode(soup)) #使用unicode()函数以Unicode字符串形式输出,Python 3不能使用unicode()函数
BeautifulSoup能够将复杂的HTML转换成为一个复杂的树形结构,其中每个节点都是python对象,所有这些对象可以分类4大类,分别为:
Tag
NavigableString
BeautifulSoup
Comment
soup = BeautifulSoup('<b class="boldest">Extremely bold</b>')
tag = soup.b
tag中最重要的属性: name和attributes
Name:
tag.name:获取tag名字
Attributes:
tag[‘属性名’]:查看特定属性,如tag[‘class’],tag[‘id’],soup.p[‘class’]
tag.attrs:查看所有属性
在Beautiful Soup中多值属性的返回类型是list
查找标签的方法:
tag的其它属性:
Beautiful Soup用 NavigableString 类来包装tag中的字符串,字符串不支持 .contents 或 .string 属性或 find() 方法.
如果一个标签只有一个子节点且是字符串类型,可以这样访问 tag.string,等同于ts[0]的形式。
soup = BeautifulSoup('<b class="boldest">Extremely bold</b>')
print(soup.b.string)
print(ts[0])
print(type(soup.b.string))
print(type(ts[0]))
结果:
Extremely bold
Extremely bold
<class ‘bs4.element.NavigableString’>
<class ‘bs4.element.NavigableString’>
tag中包含的字符串不能编辑,但是可以被替换成其它的字符串,用 replace_with() 方法:
place_with("No longer bold")
BeautifulSoup 对象表示的是一个文档的全部内容,包含了一个值为 “[document]” 的特殊属性 .name
soup.name
Comment 对象是一个特殊类型的 NavigableString 对象,它是文档的注释部分。
参考文献:
【1】.zh.html#Navigating%20the%20Parse%20Tree
【2】
本文发布于:2024-02-04 12:09:33,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170706882655436.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |