以https://movie.douban.com/top250为例子
引用
from bs4 import BeautifulSoup
soup = BeautifulSoup(html_doc, 'lxml')
html_doc
用requests获取
选择器
1.标签选择器
标签选择器只选择第一个!
选择元素
嵌套选择
soup.div.p #返回 标签+内容
<p class="appintro-title">豆瓣</p>
选择内容
soup.title.string #返回str
豆瓣电影 Top 250
也可以 soup.title.get_text()
选择属性
soup.div.attrs #返回dict
{'id': 'db-global-nav', 'class': ['global-nav']}
soup.div['id'] #soup.div.attrs['id'] 返回dict中的value
db-global-nav
其他
选择标签名字 soup.title.name 返回title
2.find_all()
find_all( name , attrs , recursive , text , **kwargs )
- name:html中的标签,如
'li'
,'a'
,'div'
,'p'
soup.find_all('li') #返回list,都 标签+内容
#就算是li标签中有li标签,都会分开算成2个
- attrs:属性,头标签里面的东西,如
'id'
,'class'
,'href'
soup.find_all(attrs={'class':'title'})
#返回list形式,都 标签+内容
#如果不用attrs,class用的是class_
#soup.find_all(class_="title")
text:搜索有的字符串内容,非标签了,而是内容
list,都 标签+内容limit:限制数目输出
soup.find_all(attrs={'class':'title'}, limit=2)
[<span class="title">肖申克的救赎</span>, <span class="title"> / The Shawshank Redemption</span>]
参数的其他写法
字符串为基本。另有正则,列表,布朗。甚至方法(lambda…)。
正则:
soup.find_all(text=re.compile('克的'))
[<span class="title">肖申克的救赎</span>]
列表:任一匹配则返回
soup.find_all(['em', 'title'])
布朗:
for a in soup.find_all(True,recursive=False): #recursive表示查不查子孙节点
print(a.name)
html
方法:
soup.find_all(lambda a:len(a.attrs)==3)
3.select()
‘.class_name’
‘#id_name’
‘tag_name’
都list, 标签+内容