Python 爬虫领域的bs4
在 Python 爬虫领域,bs4
是 BeautifulSoup4 的简称,它是一个 Python 库,用于从网页中提取数据。bs4
主要用于解析和处理 HTML 和 XML 文档,并提供了一个 Pythonic 的接口来操作这些文档。
具体来说,BeautifulSoup
能够:
-
解析 HTML/XML 文档:它将网页的 HTML 或 XML 转换成一个结构化的树形结构,便于访问各个元素。
-
查找和选择标签:使用
find()
、find_all()
等方法,你可以轻松地选择网页中的元素,比如特定的标签、类名、id 等。 -
修改内容:你可以修改文档中的内容,例如更新标签的文本、属性等。
下面是一个基本的使用示例:
from bs4 import BeautifulSoup
import requests
# 发送 GET 请求,获取网页内容
url = 'https://example.com'
response = requests.get(url)
# 解析 HTML 内容
soup = BeautifulSoup(response.text, 'html.parser')
# 查找网页中的所有链接
links = soup.find_all('a')
# 输出所有链接
for link in links:
print(link.get('href'))
在这个示例中,BeautifulSoup
解析了从 example.com
获取的网页,并使用 find_all()
方法提取所有的 <a>
标签(即所有的链接)。然后,使用 link.get('href')
获取每个链接的 URL。
BeautifulSoup4
是一个非常强大且易于使用的工具,特别适合用在网页爬取和数据提取的工作中。
提取劳动法,并进行json格式化
import requests
from bs4 import BeautifulSoup
import re
def scrape_gongcheng_article(url):
"""从工程政府网站抓取劳动法条文内容并转换为结构化数据。
Args:
url (str): 工程政府网站的目标页面URL
Returns:
dict: 包含劳动法条文的字典,格式为 {中华人民共和国劳动法_第X条: 条文内容}
如果发生错误,返回错误信息字符串
"""
try:
# 获取页面内容并设置正确的编码
response = requests.get(url)
response.encoding = 'utf-8'
# 验证请求是否成功
if response.status_code != 200:
return f"请求失败,状态码: {
response.status_code}"
# 使用BeautifulSoup解析HTML内容
soup = BeautifulSoup(response.text, 'html.parser')
# 提取所有段落文本
content_elements = soup.select('p')
all_content = [p.get_text(strip=True) for p in content_elements] if content_elements else []
# 使用正则表达式匹配条文格式(第X条)
pattern = r'^第[一二三四五六七八九十百千]+条'
filtered_content = [text for text in all_content if re.match(pattern, text)]
# 构建结构化数据字典
result_dict = {
}
for content in filtered_content:
key = re.search(pattern, content).group()
value = re.sub(pattern, '', content).strip() # 移除条文编号
result_dict[f'中华人民共和国劳动法_{
key}'] = value
return result_dict
except Exception as e:
return f"发生错误: {
str(e)}"
# 程序入口
if __name__ == "__main__":
import json
url = "http://www.gongcheng.gov.cn/ggfw/ldjy_67871/bzgf_74300/202403/t20240315_2665680.html"
result = scrape_gongcheng_article(url)
# 将结果保存为JSON文件,使用UTF-8编码确保中文正确显示
with open('output.json', 'w', encoding='utf-8') as f:
json.dump(result, f, ensure_ascii=False, indent=4)