day27-python-spider

day27-python-spider

python

Bs4解析库

Beautiful Soup简称BS4,它可以从HTML或XML文档中快速地提取指定的数据。

由于BS4解析页面时需要依赖文档解析器,所以还需要按照lxml作为解析库:

Python自带了一个文档解析库html.parser,但是其解析速度稍慢于lxml。

还可以使用html5lib解析器

BS4解析对象

from bs4 import BeautifulSoup
from fake_useragent import UserAgent
import requests

# 需要请求的url地址
url = 'https://movie.douban.com/chart'

ua=UserAgent()
headers={
    "User-Agent":ua.ie
}
resp=requests.get(url=url,headers=headers)

html=resp.text

soup=BeautifulSoup(html,"html.parser")
# 格式化输出 html/xml
print(soup.prettify())

BS4常用语法

文档树种的每个节点都是Python对象,这些对象大致分为四类:Tag,NavigableString,BeautifulSoup,Comment。

  • Tag:标签类,html文档种所有的标签都可以看作Tag对象
  • NavigableString:字符串类,指的时标签种的文本内容,使用text、string、strings来获取文本内容
  • BeautifulSoup:表示一个Html文档的全部内容,可以把它当作一个特殊的Tag对象
  • Comment:表示HTML文档种的注释内容以及特殊字符串,他是一个特殊的NavigableString

Tag节点

from bs4 import BeautifulSoup
from fake_useragent import UserAgent
import requests

# 需要请求的url地址
url = 'https://movie.douban.com/chart'

ua=UserAgent()
headers={
    "User-Agent":ua.ie
}
resp=requests.get(url=url,headers=headers)

html=resp.text

soup=BeautifulSoup('<p class="Web site url"><b>c.biancheng.net</b></p><p class="aaaa"><b>other.cn</b></p>',"html.parser")
# 格式化输出 html/xml
html=soup.prettify()
# 获取tr标签
trList=soup.p
print(trList)
# 获取b标签
print(soup.p.b)
# 返回一个标签的属性和值组成的字典
print(soup.p.attrs)
# 获取属性的值
print(soup.p['class'])
# 给属性复制
soup.p["class"]="Web site"
print(soup.p)
# 以列表形式输出所有子节点
pTag=soup.p
print(pTag.contents)

# 遍历有子节点
for children in pTag.children:
    print(children)

find()和find_all()

  • find_all()
find_all()方法用来搜索当前tag的所有子节点,并判断这些节点是否符合过滤条件,最后以列表形式将符合条件的内容返回
find_all(name,attrs,recursive,text,limit)
参数说明:
name:查找所有名字为name的tag标签,字符串对象会被自动忽略
attrs:按照属性名和属性值搜索tag标签,注意由于class是python的关键字,所以要使用clss_
recursive:fian_all() 会搜索tag的所有子孙节点,设置recursive=False可以只搜索tag的直接节点
text:用来搜索文档种的字符串内容,该参数可以接受字符串、正则表达式、列表、True
limit:由于find_all()会返回所有的搜索结果,这样会影响执行效率,通过limit参数可以限制返回结果的数量
import requests
from fake_useragent import UserAgent
from bs4 import BeautifulSoup

url="https://movie.douban.com/chart"

ua=UserAgent()
headers={
    "User-Agent":ua.ie
}
resp=requests.get(url=url,headers=headers)

html=resp.text

soup=BeautifulSoup(html,"html.parser")

# print(soup.prettify())

itemList=soup.find_all("tr",class_="item")
for item in itemList:
    # print(item)
    movieUrl=item.a["href"]
    movieName=item.a["title"]
    movieImgUrl=item.img["src"]
    print(movieUrl,movieName,movieImgUrl)

find()

find()方法与find_all()类似,find_all()返回所有符合条件的,find()仅返回一个符合条件的结果

注:
find() 如果没有找到标签会返回None
find_all() 如果没有找到标签会返回空列表

CSS选择器

BS4支持大部分的CSS选择器,比如常见的标签选择器、类选择器、id选择器、层级选择器
BeautifulSoup提供了一个select()方法,通过向该方法种添加选择器,就可以在HTML文档种搜索到与之对应的内容。
import requests
from fake_useragent import UserAgent
from bs4 import BeautifulSoup

url="https://movie.douban.com/chart"

ua=UserAgent()
headers={
    "User-Agent":ua.ie
}
resp=requests.get(url=url,headers=headers)

html=resp.text

soup=BeautifulSoup(html,"html.parser")

# print(soup.prettify())

itemList=soup.find_all("tr",class_="item")
for item in itemList:
    # print(item)
    movieUrl=item.select('a[href]')
    print(movieUrl)
posted @ 2022-04-14 21:58  黎白昼  阅读(26)  评论(0)    收藏  举报