当前位置:网站首页 > HTML与CSS基础 > 正文

bs4解析html(bs4解析网页)



    获取我自己写的n篇UnderMine专栏中的166件圣物数据

关键词:python  爬虫

方法一:最朴素的思想——复制粘贴

如果这个方法能简单解决问题,我也不会写这篇专栏了......

首先,很遗憾,直接复制粘贴并不能达到我期望的效果。因为我想要html代码的数据,这样在查询软件中也能渲染出加粗、颜色等文字效果。如果用F12+复制指定元素,需要我手动执行166*3次,人都点麻了。

其次,专栏内容的圣物不是完全按编号升序排列的,需要手动填入表格的对应编号行,费眼睛。可以输入单元格号来快速定位,但还是好麻烦。

方法二:网络爬虫

网络爬虫,是一种按照既定规则自动抓取网络数据或执行网络请求的程序,比较适合完成此类任务。之前浅学过一段时间,现在拿出来实际运用一下。

选用的策略是:获取html文档,喂给BeautifulSoup4(简称bs4)来解析,然后抽出想要的信息。重点就在于如何抽取所需信息——需要找出这些信息的特征,才能让bs4定位到信息所在标签tag,取出内容。

2.1.1 获取html文档

我所要的信息分布在10篇专栏中,访问它们的关键就在于CV号。

还好我有做过一篇目录专栏,通过它可以很方便地获取(爬a标签)到这些CV号。

使用requests库向发送html get请求后,10篇专栏的HTML文档就到手了!

2.1.2 使用bs4来解析html文档

Beautiful Soup是一个可以从HTML或XML文件中提取数据的Python库,它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式。

——BS4官方文档

接下来是为之后bs4定位“效果”“简评”“评分”tag做准备,先使用浏览器的“检查(inspect)”功能来查看各圣物专栏的tag特征。

首先,在检查后发现,专栏的内容部分在id=read-article-holder的div标签中,初步缩小了搜索范围。

其次,可以发现在div标签下含了无数的没有id的同级p标签。

由上图可见,编号,简评,评分都在p标签里,而周围都是同级的p标签,所以无法通过标签名、只能以标签内容来定位

效果的内容都在ul列表标签内,专栏内使用此标签的也只有效果部分,可以作为标志来定位。

2.1.3 抽取信息

2.0.0 导入包和模块

2.1.1 获取html文档

2.1.2 使用bs4来解析html文档

2.1.3~2.2 抽取信息+效果、简评、评分按序录入已有excel

2.3 测试代码

以上代码似乎缺少了些面向对象的思想,这组功能围绕CV号、HTML文件和BS结构树展开,显然可以编成类,以进一步简化代码:

测试代码:

一开始,我的评分过滤器是从解析顺序着手的,用了BS遍历文档树-回退和前进的.next/previous_element方法:

但对第一篇专栏的提取数据却不符合预期:

于是我尝试查看这些无关标签满足筛选条件的原因:

问题得以迎刃而解:

后来又改用get_text方法获取tag中包含的所有文本内容,还能去除tag间多余的空格,好用!

6.1.1 筛选出指定条件的tag

find_all()方法

功能:搜索当前tag的所有子孙节点,并筛选出所有符合条件的tag,返回值为列表

语法:tag或BeautifulSoup对象.find_all(name, attrs, recursive, string, kwargs)

简写

参数

相似方法find()方法,是find_all()方法的单数版本,有相同的形参,返回首个符合条件的tag

find_previous()方法

功能:搜索当前节点前符合条件的首个tag或字符串

语法:tag.find_previous(name, attrs, recursive, string, kwargs)

参数:参考find_all()方法

相似方法find_all_previous()方法,是find_previous()方法的复数版本,返回当前节点前所有符合条件的tag或字符串;而find_next(),find_all_next()是搜索当前节点后。它们都有相同的形参。

find_next_sibling()方法

功能:搜索当前节点后的所有兄弟节点,返回首个符合条件的tag

语法:tag或BeautifulSoup.find_next_sibling(name, attrs, recursive, string, kwargs)

参数:参考find_all()方法

相似方法find_next_siblings()方法,是find_next_sibling()方法的复数版本;而find_previous_sibling(),find_previous_siblings()是搜索当前节点前。它们都有相同的形参。

6.1.2 得到tag内的字符串

string方法

功能:对于仅含一段文本的tag或只有一个子标签且文本只出现在子标签间的tag,返回这段文本字符串

语法:tag.string

注意:时,tag.string无法确定调用哪个子节点的内容,

相似方法strings方法,对于包含多个文本字符串的tag,返回一个包含所有文本字符串的生成器,可以使用for循环来获取其中的内容;stripped_strings方法,是去除空格、空行的strings版本。它们都不需要形参。


get_text()方法

功能获取tag所含所有文本内容,包括子孙tag中的内容,返回合并后的Unicode字符串

语法:tag或BeautifulSoup对象.get_text(sep, strip=True)

参数


1. BS4官方说明文档-中文版

https://beautifulsoup.readthedocs.io/zh_CN/v4.4.0/

2. xlsx文件的读写(openpyxl库的使用)

https://blog.csdn.net/liuyingying0418/article/details/

3. xls文件的读写(xlrd/xlwt/xlutils库的使用)

https://cooc.cqmu.edu.cn/Course/KnowledgePoint/9389.aspx

4. 正则表达式的用法(re模块的使用)

https://www.cnblogs.com/huxi/archive/2010/07/04/1771073.html

5. BS4中string和text的区别

https://www.cnblogs.com/kaibindirver/p/11374669.html

到此这篇bs4解析html(bs4解析网页)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!

版权声明


相关文章:

  • html聊天代码(html5聊天界面代码)2024-12-10 10:27:06
  • css3(css3是什么的缩写)2024-12-10 10:27:06
  • css3新增属性(css3中新增属性)2024-12-10 10:27:06
  • html5+css3网页设计基础教程(HTML5+CSS3网页设计基础教程王莹相成久史迎新)2024-12-10 10:27:06
  • css grid布局(css grid布局居中)2024-12-10 10:27:06
  • css4(Css4规范)2024-12-10 10:27:06
  • css样式规范(css样式规则)2024-12-10 10:27:06
  • 字体图标怎么设置大小css(css图标和字体水平对齐)2024-12-10 10:27:06
  • html5+css3网页设计基础教程(html5css3网页设计基础教程ppt)2024-12-10 10:27:06
  • bs4解析html(bs4解析需要一层一层的找吗?)2024-12-10 10:27:06
  • 全屏图片