爬虫 之 BeautifulSoup

本文详细介绍了使用Python的BeautifulSoup库进行HTML解析的方法,包括生成soup对象,选择节点,提取属性值或文本值,获取直接子节点、子孙节点、父节点及兄弟节点,以及使用find_all和find方法定位节点。
from import BeautifulSoup
html = '~~~~~~~~~~~~~'
soup = BeautifulSoup(html, 'lxml')
print(soup.title.string)

简单情况   生成soup对象,用该对象选择节点,然后提取属性值或者文本值,这就是这篇博客的目的了

 

 

获取直接子节点:

print(soup.p.contents)

 

获得子孙节点:  返回为生成器类型

for i, child in enumerate(soup.p.descendants):
    print(i,child)

 

获得父节点:

print(soup.p.parent)# 获得的是p 的直接父节点

print(soup.p.parents) #获得的是祖先系列的所有父节点

 

获取兄弟节点:

print(soup.p.next_sibling)#后面的一个兄弟
print(soup.p.previous_sibling)#前面的一个兄弟
print(list(enumerate(soup.p.next_siblings)))#后面的所有兄弟
print(list(enumerate(soup.p.previous_siblings)))#前面的所有兄弟

 

单节点:

如何取文本:

print(soup.p.string)#只会选择第一个找到的p节点,然后输出其本文

如何取属性值:

print(soup.p['class'])#只会找到第一个p节点,输出器 class属性的值

 

多节点:

#取文本
print(list(soup.p.parents)[0])#从里至外 算顺序


#取属性
print(list(soup.p.parents)[0].attrs['class'])
print(list(soup.p.parents)[0]['class'])

 

 

补:还可以用find_all(name, attrs, text )方法来找对应的节点(可以找到多个)

 

name: 利用节点名

print(soup.find_all(name='ul'))  #通过节点名名来找节点

for ul in soup.find_all(name='ul'):
    print(ul.find_all(name='li'))   #这种通过节点名字来找节点的方法还可以嵌套

 

attrs:利用属性

print(soup.find_all(attrs={ 'id':'list' })) # 属性名与值的键值对 用 字典来表示

print(soup.find_all(id='list'))  #这是简便的写法

#当然了,由于class是python关键字,所以这里特殊为 class_
print(soup.find_all(class_='color'))

 

text: 利用文本值,   text 可以为文本 或 正则表达式

print(soup.find_all(text='hello'))

print(soup.find_all(text= re.compile('link')))

 

补:find(name, attrs, text) 方法和find_all()一样使用,不过,其只能返回第一个匹配的节点

一样的使用方式,但是查询的范围不同:(参数条件都是一样的使用)

find_parents():返回所有满足条件的祖先节点

find_parent():返回满足条件直接父节点

 

find_next_siblings() 、find_next_sibling() :返回后面的满足条件所有兄弟节点、  返回后面的满足条件第一个兄弟节点

 

find_previous_siblings()、find_previous_sibling():返回前面的满足条件所有兄弟节点、  返回前面的满足条件第一个兄弟节点

 

补:用css选择器找相应的节点:   只要使用select()方法就好了

print(soup.select('ul li')) # 找ul标签下的所有li节点
print(soup.select('#list .element')) #找id选择器list 下的 其中类选择器为element的节点


#当然了,也可以嵌套的
for ul in soup.select('ul'):
    print(ul.select('li'))      #找到所有ul下的   所有li节点

 

 

ok,真正结束了

 

 

88

<think>嗯,用户想学习BeautifulSoup相关的爬虫基础知识,特别是基础教程和使用方法。首先,我需要整理BeautifulSoup的核心知识点,确保涵盖安装、基本对象、解析器选择以及常用方法。 首先,安装部分。用户可能需要知道如何安装BeautifulSoup和依赖库,比如用pip安装bs4和requests。记得提醒安装解析器,比如lxml或html5lib,因为不同的解析器有不同的优缺点。 接下来是基本对象。根据引用[4],BeautifulSoup有四种对象:Tag、NavigableString、BeautifulSoup和Comment。需要逐一解释这些对象是什么,并给出例子,比如如何获取Tag的名称和属性。 然后,解析器的选择很重要。不同的解析器在速度和兼容性上有差异,比如lxml通常更快,而html5lib能处理复杂的HTML。用户可能需要根据项目需求选择合适的解析器。 常用方法部分,要包括如何加载文档,比如用requests获取网页后用BeautifulSoup解析。然后,find和find_all的区别,以及CSS选择器的使用。这些是爬虫中最常用的方法,需要详细说明并给出代码示例,比如如何提取标题或链接。 另外,用户可能对实际案例感兴趣,引用[2]提到结合Requests库爬取新闻网站的信息。可以举一个简单的例子,比如爬取新闻标题和链接,这样用户能更好地理解应用过程。 最后,生成相关问题时要覆盖安装、对象、解析器、方法和应用场景,这样用户如果有进一步的问题,可以自行探索。同时,注意引用标记的正确使用,比如引用[1]和[2]对应的内容。 需要确保回答结构清晰,分步骤讲解,代码示例正确,并且语言简洁。避免使用复杂术语,让初学者也能理解。同时检查LaTeX格式是否正确,虽然这里可能用不到数学公式,但如果有变量或代码内嵌,仍需遵循规范。</think># BeautifulSoup 爬虫基础教程 ## 一、环境配置与安装 1. 安装核心库: ```bash pip install beautifulsoup4 requests ``` 2. 选择解析器(必须至少安装一个): - `lxml`(推荐):`pip install lxml` - `html5lib`:`pip install html5lib` > 注意:不同解析器对HTML容错处理能力不同[^1] ## 二、四大核心对象 1. **Tag对象** 对应HTML标签,可通过`.tagName`访问: ```python soup = BeautifulSoup(html_doc, 'lxml') title_tag = soup.title # 获取<title>标签 ``` 2. **NavigableString** 表示标签内的文本内容: ```python print(title_tag.string) # 输出标签内纯文本 ``` 3. **BeautifulSoup对象** 整个文档树的根节点: ```python print(type(soup)) # <class 'bs4.BeautifulSoup'> ``` 4. **Comment对象** 处理HTML注释的特殊类型: ```python comment = soup.b.string if type(comment) == bs4.element.Comment: print("这是注释内容") ``` ## 三、解析器对比 | 解析器 | 速度 | 依赖项 | 特性 | |--------------|--------|----------|--------------------------| | Python标准库 | 慢 | 无 | 容错性差 | | lxml | 快 | 需要C库 | 处理不规范HTML | | html5lib | 最慢 | 纯Python | 完全遵循HTML5标准 | ## 四、常用方法详解 ### 1. 文档加载 ```python import requests from bs4 import BeautifulSoup url = 'http://example.com' response = requests.get(url) soup = BeautifulSoup(response.text, 'lxml') # 推荐组合 ``` ### 2. 节点查找 **find() vs find_all()** ```python # 查找第一个<div> first_div = soup.find('div', class_='header') # 查找所有带href属性的<a>标签 all_links = soup.find_all('a', href=True) ``` **CSS选择器** ```python # 选择id为content的div下的所有p标签 paragraphs = soup.select('div#content > p') ``` ### 3. 属性提取 ```python for link in all_links: print(link['href']) # 获取href属性 print(link.get_text()) # 获取标签内全部文本 ``` ## 五、实战案例:新闻爬虫 ```python import requests from bs4 import BeautifulSoup url = 'https://news.example.com' response = requests.get(url) soup = BeautifulSoup(response.text, 'lxml') news_list = [] for article in soup.select('.news-article'): title = article.find('h2').get_text(strip=True) link = article.find('a')['href'] time = article.find('time')['datetime'] news_list.append({ '标题': title, '链接': link, '时间': time }) ``` > 该案例展示了如何提取结构化数据[^2] §§ 相关问题 §§ 1. 如何处理BeautifulSoup中的动态加载内容? 2. 如何防范反爬机制对BeautifulSoup的影响? 3. 如何将BeautifulSoup与Selenium结合使用? 4. 如何优化BeautifulSoup的解析效率? 5. 如何处理网页中的编码问题? : https://beautifulsoup.readthedocs.io/zh_CN/v4.4.0/ : https://example.com/crawler-case
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值