一周爬虫集训任务二:学习beautifulsoup+xpath

本文介绍了Python爬虫中Beautifulsoup和XPath的使用,包括Beautifulsoup的安装、遍历和搜索文档树的方法,以及XPath的基本概念、语法和在提取丁香园论坛数据时的应用。通过实例展示了如何使用这两者提取网页内容。
摘要由CSDN通过智能技术生成

1 任务

Task2(2天)
2.1 学习beautifulsoup
1. 学习beautifulsoup,并使用beautifulsoup提取内容。
2. 使用beautifulsoup提取丁香园论坛的回复内容。
3. 丁香园直通点:http://www.dxy.cn/bbs/thread/626626#626626 。
4. 参考资料:https://blog.csdn.net/wwq114/article/details/88085875

2.2 学习xpath 
1. 学习xpath,使用lxml+xpath提取内容。
2. 使用xpath提取丁香园论坛的回复内容。
3. 丁香园直通点:http://www.dxy.cn/bbs/thread/626626#626626 。
4. 参考资料:https://blog.csdn.net/naonao77/article/details/88129994

2 beautifulsoup

2.1 简介

使用正则表达式来匹配会出现很多问题,一个字符写错都会导致匹配结果出错,而且由于爬虫对象的格式不一定统一,这也给正则表达式带来了极大的困难。那么接下来学习beautifulsoup

BeautifulSoup是python的一个库,最主要的功能是从网页抓取数据。BeautifulSoup是一个可以将复杂的HTML文档转换成一个复杂的树形结构,每个节点都是python对象,所有对象可以归纳为4种:Tag、NavigableString、BeautifuSoup和Comment。

  • Tag 就是html中的一个个标签。像dl、dt、a、dd、p等HTML标签加上里面包括等内容就是Tag,我们可以用soup加标签名轻松的获取这些标签的内容,这些对象的类型是bs4.element.Tag。 print(soup.p)
    Tag有两个重要的属性,name(名字)和attrs(属性)
  • NavigableString 想要获得标签内的文字,可以用.string。print (soup.p.string)
  • BeautifulSoup对象表示的是一个文档的内容,大部分时候,可以把它当作Tag对象,是一个特殊的Tag,可以分别获取它的类型,名称,以及属性。名字:print(soup.name)类型:print(type(soup.name)) 属性:print(soup.attrs)
  • Comment对象是一个特殊类型的NavigableString对象,其输出的内容不包括注释符号。例如:<!--elsie-->。那么该NavigableSring对象会转换成Comment对象,并且会把注释符号去掉。
from bs4 import BeautifulSoup

html = """
<head><title>the dormouse</title></hed>
<a class="sister" href="http://example.com/elsie" id="link1"<!--elsie--></a>
<p class="title" name="dromous"><b>the dormouse's story</b></p>
"""
#创建beautifulsoup对象
soup = BeautifulSoup(html,features="lxml")

print(soup.a)
print(soup.a.string)
print(type(soup.a.string))

结果为:

<a class="sister" href="http://example.com/elsie" id="link1"></a>
None
<class 'NoneType'>

2.2 安装

Beautiful Soup 3 目前已经停止开发,推荐在现在的项目中使用Beautiful Soup 4,不过它已经被移植到BS4了,也就是说导入时我们需要 import bs4 。所以这里我们用的版本是 Beautiful Soup 4.3.2 (简称BS4)。

首先在命令行中利用pip install beautifulsoup4安装库,安装好后在python解析器输入from bs4 import BeautifulSoup看能否导入成功。注意安装库名与导入的不同,要特别注意。

因为我的环境是:anaconda+pycharm,可以直接导入BeautifulSoup包:from bs4 import BeautifulSoup

2.3 遍历和搜索文档树

2.3.1 遍历文档树
  1. 直接子节点
    (1).contentstag 对象的.contents属性可以将某个tag的子节点以列表的方式输出,当然列表会允许用索引的方式来获取列表中的元素。
    (2).children:Tag对象的children属性是一个迭代器

  2. 所有子孙结点
    (1).descendants属性:与Tag对象的childrencontents仅包含Tag对象的直接子节点不同,该属性是将Tag对象的所有子孙结点进行递归循环,然后生成生成器

  3. 结点内容
    (1)Tag对象内没有标签的情况
    (2)Tag对象内有一个标签的情况
    (3)Tag对象内有多个标签的情况

  4. 直接父节点
    (1)标签的父节点
    (2)内容的父节点:是包在内容外的第一层标签

  5. 全部父节点
    .parents属性,得到的也是一个生成器

  6. 兄弟结点
    .next_sibling.previous_sibling属性分别是获取下一个兄弟结点和获取上一个兄弟结点。

    通常情况下,使用这两个属性会得到空白或者换行。因为beautifulsoup会将空白和换行识别成一个结点

  7. 全部兄弟结点
    .next_siblings.previous_siblings可以对当前的兄弟结点迭代输出

  8. 前后元素
    .next_element.previous_element属性,是获得不分层次的前后元素(同一层的才叫兄弟结点

  9. 所有前后元素
    .next_elements.previous_elements属性可以向前或向后解析文档内容

2.3.2 搜索文档树
  1. find_all
    (1)使用方法:find_all(name,attrs,recursive,text,**kwargs)
    (2)搜索范围:当前tag的所有tag子节点。
    (3)作用:这些参数相当于过滤器一样可以进行筛选处理。不同的参数过滤可以应用到以下情况:
    (4)name参数:查找标签。查找所有名字为name的tag,字符串会被自动忽略掉。
    (5)keyword参数:通过name参数是搜索tag的标签类型名称,如a、head、title;如果要通过标签内属性的值来搜索,要通过键值对的形式来指定。例如:soup_findall(id='link2')
    (6)text参数:查找文本。作用和name参数类似,但是text参数的搜索范围是文档中的字符串内容(不包含注释),并且是完全匹配,当然也接受正咋表达式、列表、True。
    (7)limit参数:可以通过limit参数来限制使用name参数或者attr参数过滤出来的条目的数量
    (8)recuresive参数:通常情况下使用find_all方法时,会返回
    (9)attrs参数:查找标签的属性
  2. find
    (1)使用方法:find(name,attrs,recursive,text,**kwargs)
    (2)与find_all的区别:find_all将所有匹配的条目组合成一个列表,而find仅返回第一个匹配的条目。
    (3)除此之外,用法相同
  3. find_parents find_parent
    (1)find_all()和find()搜索的范围是当前节点的所有子孙节点(recursive默认的情况下)。
    (2)而find_parents和find_parent的搜索范围则是当前节点的父节点
    (3)两个函数的特性和其他用法与上面所述相同。
  4. find_next_siblings和find_next_sibling
    (1)搜索范围是当前结点后面的兄弟结点。
    (2)其他特性和用法与上面的完全相同。
  5. find_previous_siblings和find_previous_sibling
    (1)搜索范围是当前结点前面的兄弟结点。
    (2)其他特性和用法与上面的完全相同。
  6. find_all_next和find_next
    (1)搜索范围是当前结点后面的结点或字符串。
    (2)其他特性和用法与上面的完全相同
  7. find_all_previous和find_previous
    (1)搜索范围是当前结点前面的结点或字符串。
    (2)其他特性和用法与上面的完全相同

2.4 使用beautifulsoup提取丁香园论坛的回复内容

  1. 任务要求:使用beautifulsoup提取丁香园论坛的特定帖子的所有回复内容,以及回复人的信息。
  2. 首先进去丁香园论坛查看源网页找到相关的HTML标签
    发帖人:在这里插入图片描述
    帖子的内容:
    在这里插入图片描述
    然后发现这两个标签都是唯一的,所以直接使用find在HTML中找到标签即可:
user_id = item.find("div", "auth").get_text()
content = item.find("td", "postbody").get_text("|", strip=True)

完整代码如下:

import requests
from  bs4 import BeautifulSoup as bs

def get_soup():
    headers =
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值