python爬虫学习(二):使用python获取网站所有文章标题及对应链接_ ...

python爬虫学习(二):使用python获取网站所有文章标题及对应链接_ ...

2023年6月29日发(作者:)

python爬⾍学习(⼆):使⽤python获取⽹站所有⽂章标题及对应链接代码如下:import requestsfrom bs4 import BeautifulSoupimport jsondef download_all_htmls(): """ 下载所有列表页⾯的HTML,⽤于后续的分析 """ htmls = [] #列表 for idx in range(34): #⼀共34页 url = f"/page/{idx+1}" #⾃动爬取所有页⾯ print("craw html:", url) r = (url) #发送GET请求,返回的是⼀个包含服务器资源的Response对象 if _code != 200: #状态码为200则表⽰服务器已成功处理了请求 raise Exception("error") () return htmlshtmls = download_all_htmls()def parse_single_html(html): """ 解析单个HTML,得到数据 @return list({"link", "title", [label]}) """ soup = BeautifulSoup(html, '') #解析html字符串,表⽰解析⽤的解析器 articles = _all("article") #找到article标签,⽂章的标题和超链接都在article标签⾥⾯,find_all()返回的是⼀个列表 datas = [] #存放数据的列表 for article in articles: #

查找超链接 title_node = ( article .find("h2", class_="entry-title") .find("a") ) title = title__text() #标题 link = title_node["href"] #超链接 #

查找标签列表 tag_nodes = ( article .find("span", class_="cat-links") .find_all("a") #find_all()返回⼀个列表 )

tags = [tag__text() for tag_node in tag_nodes] ( {"title": title, "link": link, "tags": tags} #将字典存⼊列表 ) return datasall_datas = []for html in htmls: all_(parse_single_html(html)) #extend()

函数⽤于在列表末尾⼀次性追加另⼀个序列中的多个值with open("all_article_", "w",encoding='utf-8') as f: for data in all_datas: ((data, ensure_ascii=False)+"n")BeautifulSoup将⼀段⽂档传⼊BeautifulSoup 的构造⽅法,就能得到⼀个⽂档的对象, 可以传⼊⼀段字符串或⼀个⽂件句柄。⾸先,⽂档被转换成Unicode,并且HTML的实例都被转换成Unicode编码。然后,Beautiful Soup选择最合适的解析器来解析这段⽂档,如果⼿动指定解析器那么BeautifulSoup会选择指定的解析器来解析⽂档。Python标准库中的HTML解析器:BeautifulSoup(markup, “”):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 BeautifulSoupdoc = "

Heading

Text"soup = BeautifulSoup(doc,'lxml')print(str(soup)) #使⽤ str函数将Beautiful Soup⽂档(或者它的⼦集)转换为字符串print(fy()) #prettify()函数添加了⼀些换⾏和空格以便让⽂档结构看起来更清晰print(unicode(soup)) #使⽤unicode()函数以Unicode字符串形式输出,Python 3不能使⽤unicode()函数BeautifulSoup能够将复杂的HTML转换成为⼀个复杂的树形结构,其中每个节点都是python对象,所有这些对象可以分类4⼤类,分别为:TagNavigableStringBeautifulSoupCommentTagsoup = BeautifulSoup('Extremely bold')tag = 中最重要的属性: name和attributesName::获取tag名字Attributes:tag[‘属性名’]:查看特定属性,如tag[‘class’],tag[‘id’],soup.p[‘class’]:查看所有属性在Beautiful Soup中多值属性的返回类型是list查找标签的⽅法:1. BeautifulSoup对象.标签名:查看标签内容,如.b。通过点取属性的⽅式只能获得当前位置下的第⼀个标签2. find() 和 find_all()find_all()和 find()仅对Tag对象以及 顶层剖析对象有效_all(“title”)_all(“p”, “title”)_all(id=“link2”)l(align=[“center”, “blah”])_all(“a”, class_=“sister”)(string=e(“sisters”)) 通过 string 参数可以搜索⽂档中的字符串内容_all(href=e(“elsie”), id=‘link1’) 搜索每个tag的”href”属性data__all(attrs={“data-foo”: “value”})tag的其它属性:1. tscontents :将tag的⼦节点以列表的⽅式输出2. en :输出为⽣成器,可以对tag的⼦节点进⾏循环3. dants:可以对所有tag的⼦孙节点进⾏递归循环4. :如果tag只有⼀个 NavigableString 类型⼦节点,那么这个tag可以使⽤ .string 得到⼦节点5. tag .strings :如果tag中包含多个字符串,可以使⽤ .strings 来循环获取6. tag …stripped_strings :去除输出的字符串中多余空⽩内容7. tag…parent :获取某个元素的⽗节点8. s:可以递归得到元素的所有⽗辈节点9. _sibling :查询下兄弟节点10. us_sibling :查询上兄弟节点11. tag…next_element:指向解析过程中下⼀个被解析的对象(字符串或tag)12. tag…previous_element :指向当前被解析的对象的前⼀个解析对象NavigableStringBeautiful Soup⽤ NavigableString 类来包装tag中的字符串,字符串不⽀持 .contents 或 .string 属性或 find() ⽅法.如果⼀个标签只有⼀个⼦节点且是字符串类型,可以这样访问 ,等同于ts[0]的形式。soup = BeautifulSoup('Extremely bold')print()print(ts[0])print(type())print(type(ts[0]))结果:Extremely boldExtremely boldtag中包含的字符串不能编辑,但是可以被替换成其它的字符串,⽤ replace_with() ⽅法:e_with("No longer bold")BeautifulSoupBeautifulSoup 对象表⽰的是⼀个⽂档的全部内容,包含了⼀个值为 “[document]” 的特殊属性 .mmentComment 对象是⼀个特殊类型的 NavigableString 对象,它是⽂档的注释部分。

发布者:admin,转转请注明出处:http://www.yc00.com/news/1687982813a63558.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信