from bs4 import Beautifulsoup # 引用其中一种解析器,引用lxml前,先要安装这个库:
soup = Beautifulsoup(markup,"html.parser")
soup = Beautifulsoup(markup,"lxml")
四大对象种类:
Tag,NavigableString,Beautifulsoup,Comment
一、Tag是HTML中的一个个标签,有两个属性,name和attrs
name:如一个b标签的name就是b,一个p标签的name就是p
二、attrs:
1、是一个字典类型的,对应的是属性-值,如:print(soup.p.attrs),输出{'class': ['title'], 'name': 'dromouse'}
2、也可以得到具体的值,如:print(soup.p.attrs['class']),输入的[title]是一个列表类型,因为一个属性可能对应多个值
3、可以直接使用print(soup.p['class'])
3、也可以通过get方法得到属性的, 如:print(soup.p.get('class'))
三、get用于得到某个标签的属性值,这是一个重要的方法, 在许多场合都能用到
四、find_all():find_all(name , attrs , recursive , text , **kwargs)
1、find_all() 方法搜索当前tag的所有tag子节点, 并判断是否符合过滤器的条件。find_all() 的返回值是一个Tag组成的列表, 方法调用非常灵活, 所有的参数都是可选的。
2、name:name 参数可以查找所有名字为 name 的tag,字符串对象会被自动忽略掉
3、传入正则表达式:如果传入正则表达式作为参数,Beautiful Soup会通过正则表达式的 match() 来匹配内容.
4、传入列表:如果传入列表参数,Beautiful Soup会将与列表中任一元素匹配的内容返回.
5、attrs参数:find_all()中第二个参数是标签的class属性值
6、keyword参数:如果一个指定名字的参数不是搜索内置的参数名,搜索时会把该参数当作指定名字tag的属性来搜索,如果包含一个名字为 id 的参数, Beautiful Soup会搜索每个tag的”id”属性
7、多个指定名字参数同时过滤tag的多个属性
soup.find_all(href=re.compile("elsie"), id='link1')
# [<a class="sister" href="http://example.com/elsie" id="link1">three</a>]
定义一个字典来搜索包含特殊属性的tag
soup.find_all(attrs={"data-foo": "value"})
# [<div data-foo="value">foo!</div>]
五、get_text()
如果只想得到tag中包含的文本内容,那么可以使用 get_text() 方法, 这个方法获取到tag中包含的所有文版内容包括子孙tag中的内容, 并将结果作为Unicode字符串返回:
markup = '<a href="http://example.com/">\nI linked to <i>example.com</i>\n</a>'
soup = BeautifulSoup(markup)
soup.get_text()
u'\nI linked to example.com\n'
soup.i.get_text()
u'example.com'
可以通过参数指定tag的文本内容的分隔符:
# soup.get_text("|")
u'\nI linked to |example.com|\n'
还可以去除获得文本内容的前后空白:
# soup.get_text("|", strip=True)
u'I linked to|example.com'
或者使用 .stripped_strings 生成器,获得文本列表后手动处理列表:
[text for text in soup.stripped_strings]
# [u'I linked to', u'example.com']
六、css选择器
写 CSS 时,标签名不加任何修饰,类名前加点,id名前加#,在这里我们也可以利用类似的方法来筛选元素,用到的方法是 soup.select(),返回类型是 list
通过标签名查找
print soup.select('title')
#[<title>The Dormouse's story</title>]
print soup.select('a')
#[<a class="sister" href="http://example.com/elsie" id="link1"><!-- Elsie --></a>, <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>, <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]
通过类名查找
print soup.select('.sister')
#[<a class="sister" href="http://example.com/elsie" id="link1"><!-- Elsie --></a>, <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>, <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]
通过id名查找
print soup.select('#link1')
#[<a class="sister" href="http://example.com/elsie" id="link1"><!-- Elsie --></a>]
组合查找
学过css的都知道css选择器,如p #link1是查找p标签下的id属性为link1的标签
print soup.select('p #link1') #查找p标签中内容为id属性为link1的标签
#[<a class="sister" href="http://example.com/elsie" id="link1"><!-- Elsie --></a>]
print soup.select("head > title") #直接查找子标签
#[<title>The Dormouse's story</title>]
属性查找
查找时还可以加入属性元素,属性需要用中括号括起来,注意属性和标签属于同一节点,所以中间不能加空格,否则会无法匹配到。
print soup.select('a[class="sister"]')
#[<a class="sister" href="http://example.com/elsie" id="link1"><!-- Elsie --></a>, <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>, <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]
print soup.select('a[href="http://example.com/elsie"]')
#[<a class="sister" href="http://example.com/elsie" id="link1"><!-- Elsie --></a>]
同样,属性仍然可以与上述查找方式组合,不在同一节点的空格隔开,同一节点的不加空格,代码如下:
print soup.select('p a[href="http://example.com/elsie"]')
#[<a class="sister" href="http://example.com/elsie" id="link1"><!-- Elsie --></a>]
以上的 select 方法返回的结果都是列表形式,可以遍历形式输出,然后用 get_text() 方法来获取它的内容
soup = BeautifulSoup(html, 'lxml')
print type(soup.select('title'))
print soup.select('title')[0].get_text()
for title in soup.select('title'):
print title.get_text()
Beautifulsoup+request爬虫
最新推荐文章于 2024-07-10 17:28:32 发布
![](https://img-home.csdnimg.cn/images/20240711042549.png)