Beautiful Soup - 轻轻松松玩转网页数据提取
网页数据提取啊,没用过Beautiful Soup的小伙伴可能觉得挺费劲。用正则表达式吧,写起来头大;直接处理HTML代码吧,又容易出错。这不,今天就带大家认识一下这个Python界的“万能铲”—— Beautiful Soup ,看看它是怎么帮我们轻松搞定网页数据提取的。
装它贼简单,一行代码的事:
pip install beautifulsoup4
还得装个解析器,推荐用lxml:
pip install lxml
拿到HTML后,创建Beautiful Soup对象就是第一步:
from bs4 import BeautifulSoup
html_doc = “”“
<html>
Beautiful Soup真好用
Python真有趣
</html>
”“”
soup = BeautifulSoup(html_doc, 'lxml')
💡温馨提示:创建对象时别忘了指定解析器,不然默认用的可能是Python自带的解析器,速度会慢不少。
想找标签?find()和find_all()就够用了:
# 找第一个p标签
first_p = soup.find('p')
print(first_p.text) # 输出:Beautiful Soup真好用
# 找所有p标签
all_p = soup.find_all('p')
for p in all_p:
print(p.text)
会写CSS选择器的小伙伴有福了,select()方法简直是为你量身定做:
# 找class为note的元素
notes = soup.select('.note')
# 找id为special的p标签
special = soup.select('p#special')
💡温馨提示:用select()方法时,返回的永远是列表,就算只找到一个元素也是列表。
Beautiful Soup给标签准备了不少属性,随手就能拿到你想要的内容:
tag = soup.find('p')
print(tag.text) # 获取文本内容
print(tag.string) # 获取文本内容(只有一个子节点时)
print(tag['class']) # 获取class属性
想找相邻的标签?next_sibling和previous_sibling帮你搞定:
first_p = soup.find('p')
next_p = first_p.next_sibling.next_sibling # 跳过换行符
print(next_p.text)
💡温馨提示:用next_sibling时可能会遇到换行符,多用一次就能跳过去。
来个真实的例子,抓取网页中的文章标题:
import requests
from bs4 import BeautifulSoup
def get_titles(url):
response = requests.get(url)
soup = BeautifulSoup(response.text, 'lxml')
titles = soup.select('h1.post-title') # 假设标题在h1标签中
return [title.text.strip() for title in titles]
写代码遇到问题别着急,打印出来看看结构准没错:
print(soup.prettify()) # 格式化输出,结构一目了然
Beautiful Soup就是这么好用,网页数据提取分分钟搞定。掌握了这些基础用法,你也能轻松应对大部分数据提取场景。动手试试,你会发现原来爬取数据这么简单!
记住几个坑:编码问题记得指定utf-8;解析结果为空检查选择器是否正确;网页加载太慢可以加个超时。
码字不易,希望这些内容对你有帮助。要是还有不明白的,评论区见!