读取html文件并进行数据处理

实际工作中,我们常遇到提取信息在本地html文件的情况,本文介绍如何读取html文件并进行预处理提取文件中的信息。

读入html文件

from bs4 import BeautifulSoup

#用本地html文件创建soup对象
#soup = BeautifulSoup(open('index.html'))
soup = BeautifulSoup(open('./1.html',encoding='utf-8'),features='html.parser')  #features值可为lxml
#可使用str函数将信息转换为字符串信息,方便使用re正则进行处理
html = str(soup)

数据处理

  • 使用正则表达式匹配处理
import re

html = str(soup)
pattern = re._compile('<div class="title">.*?<h2>(.*?)</h2>.*?时间:(.*?)</div>.*?id="detail-p"><p>(.*?)</p><p>  来源:(.*?)</p></div>',re.S)
content_list = pattern.findall(html)
content_list

#自定义函数[(),()]格式批量写入csv文件
import csv

def save_content(content_list):
    with open('../content.csv','a',encoding='gbk',newline='',errors='ignore') as f:
        writer = csv.writer(f)
        writer.writerows(content_list)
        
#写入csv文件
save_content(content_list)
  • 使用BeautifulSoup进行解析
#常用解析器:
soup = BeautifulSoup(html,"html.parser")
soup = BeautifulSoup(html,"lxml")
soup = BeautifulSoup(html,"xml")
soup = BeautifulSoup(html,"html5lib")
#把要解析的字符串以标准的缩进格式输出
soup.prettify()
#查找soup对象的第一个p标签
print(soup.p)
#标签的属性name、attrs(所有属性列表)
print(soup.p.name)
print(soup.p.attrs['name'])
print(soup.p['name'])
#获取第一个p节点的文本内容
print(soup.p.string)
#选择节点后再选择子节点,选择head节点下title子节点的内容
print(soup.head.title.string)
#返回p标签下子节点
print(soup.p.children)
for i, child in enumerate(soup.p.children):
    print(i, child)

#将p标签下所有直接子节点以列表形式展示
print(soup.p.contents)
#将p标签下递归查询所有子节点
print(soup.p.descendants)
for i, child in enumerate(soup.p.descendants):
    print(i, child)
#返回p标签下父节点
print(soup.p.parent)

#兄弟节点。next_sibling和previous_sibling分别获取节点的下一个和上一个兄弟元素,next_siblings和previous_siblings则分别返回所有前面和后面的兄弟节点的生成器。
print('Next Sibling', soup.a.next_sibling)
print('Prev Sibling', soup.a.previous_sibling)
print('Next Siblings', list(enumerate(soup.a.next_siblings)))
print('Prev Siblings', list(enumerate(soup.a.previous_siblings)))


#css选择器
#按照标签名进行选择
print(soup.select('p'))
#按照标签名和属性选择
print(soup.select('p[class='class类名']'))
#按照类名查找
print(soup.select('.class类名'))
#按照id名查找
print(soup.select(#id名))

#实例
print(soup.select('.panel .panel-heading')) #选择class='panel'下class='panel-heading'节点
print(soup.select('ul li')) #选择ul标签下li节点
print(soup.select('#list-2 .element')) #选择id='list-2'标签下class='element'节点
print(type(soup.select('ul')[0])) #选择名称为ul标签第一个

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值