BeautifalSoup的使用
Whisper Lv4

注意

HTML中看到的换行符,空格都是NavigableString 也就是文本节点。使用遍历文档树的方法时,会遍历文档树中的所有节点(包括文本节点换行,空格等)。 遍历完去gettext的时候会有时为空的,多半就是这个原因。
使用过滤器find等方法,或者手动过滤:

1
2
3
4
5
6
7
8
9
10
11
12
13
import requests
import bs4
from bs4 import BeautifulSoup

from urllib.request import urlopen

html = requests.get('xxx')
soup = BeautifulSoup(html.text,'lxml')
lis = soup.find('some').next_siblings

for l in symbolslist:
if type(l) is not bs4.element.Navigablestring:
print(sec.get_text())

常用方法

找到soup所有<a>标签的链接

1
2
for link in soup.find_all('a'):
print(link.get('href'))

从文档中获取纯文本

1
print(soup.get_text())  # 去掉了html所有标签

删除所有指定标签

1
2
3
4
5
6
soup = BeautifulSoup(content,"html.parser")

tags = soup.find_all("img") # find_all还可以指定删除标签的属性
for a_tag in tags:
a_tag.decompose()
print(soup)

取多值属性,常见的就是class的属性,获取出来时一个字符串

1
2
css_soup = BeautifulSoup('<p class="body strikeout"></p>')
css_soup.p['class'] # ["body", "strikeout"]

处理图片

在处理图片时,img的图片属性只能时src,有些网站把src属性修改成了自定义的名称,此时需要自己加src属性。

错误

AttributeError: 'ResultSet' object has no attribute 'foo' 错误通常是因为把 find_all() 的返回结果当作一个tag或文本节点使用,实际上返回结果是一个列表或 ResultSet 对象的字符串,需要对结果进行循环才能得到每个节点的 .foo 属性.或者使用 find() 方法仅获取到一个节点