我刚学的,或许对你有用import urllib.request
from bs4 import BeautifulSoup
def url_open(url):
req = urllib.request.Request(url)
req.add_header("user-agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36")
response = urllib.request.urlopen(req)
html = response.read().decode("gbk")
return html
def get_url(url):
html = url_open(url)
soup = BeautifulSoup(html,"lxml")
'''print(soup.prettify()) # 格式化代码,自动补全代码
print(soup.title.string)'#只有标签名,不会有title
print(soup.title) #有标签名的title
print(type(soup.title))
是head标签,如果没有,整个后边的
print(soup.link)#返回link标签里的选项,但是都是第一个
#获取标签的名称
print(soup.title.name) #获取的外层的标签的名称也就是title
#获取属性 下面两个的内容一样
print(soup.link.attrs["href"])
print(soup.link["href"])
# 获取内容
print(soup.title.string)
#嵌套模式
print(soup.script.src)
#子节点
print(soup.header.contents) #返回的是个列表
print(soup.header.img["src"]) #前边几层都可以.最后一层要用[]的字典形式
print(soup.ul.li.contents)
print(soup.ul.li.children)
for i,child in enumerate(soup.ul.li.children):#返回的是迭代器,用enumerate来得出
print(i,child)
#子孙节点
for i,child in enumerate(soup.ul.li.descendants):#返回的是迭代器,用enumerate来得出
print(i,child)
#父节点
print(soup.ul)
print("\n"+"i love fishc.com" +"\n")
for i,child in enumerate(soup.ul.li.parent):
print(i,child)
#祖先节点
print(soup.style)
print("\n"+"i love fishc.com" +"\n")
for i,child in enumerate(soup.style.parents):
print(i,child)
#兄弟节点
print(soup.script)
print("\n"+"i love fishc.com" +"\n")
print(len(list(enumerate(soup.script.next_siblings))))
print(list(enumerate(soup.script.previous_siblings)))
#find_all与urllib类似,可以查找标签名,属性,内容 返回的是列表,class bs4
print(soup.find_all("ul"))
print("-------------------------------------------------------------------------------------------------")
print(soup.find_all("ul")[0])
for ul in soup.find_all('ul'):
print(ul.find_all("li"))
print("-------------------------------------------------------------------------------------------------")
#attrs是查询字典属性的属性,传入的参数是字典
print(soup.find_all(attrs = { 'rel':"stylesheet"}))
print("-------------------------------------------------------------------------------------------------")
print(soup.find_all(attrs = {'id':"nav_sel"}))
#也可以直接插class,id等,由于class在python属于关键词,后边要交_,输入的是class_
print(soup.find_all(rel="stylesheet"))
print("-------------------------------------------------------------------------------------------------")
print(soup.find_all(id = "nav_sel"))
# 根据text进行选择,返回的就是字,并不是条目
print(soup.find_all(text = "福利"))
# find方法和fin_dall类似,find返回第一个元素
print(soup.find("ul"))
print(type(soup.find('ul')))
print("-------------------------------------------------------------------------------------------------")
print(soup.find("page"))
#其他函数 find_parent()父,子,兄弟,后面的,前面的
#CSS选择器,使用select()直接传入css选择器
#选择class时要加一个点,如果存在嵌套关系,两个class之间不需要加任何符号,用一个引号括起来即可,加一个空格;可以选标签; 用id选择,id用#代替 id ="list2"class = element可以用“#list2 .element”,返回的是列表
print(soup.select('.hot'))
print("-------------------------------------------------------------------------------------------------")
print(soup.select(".container .body"))
print(soup.select("#list2 .element")
print(soup.select("ul li"))'''
#select获取属性,[属性名] 或者ul[].attrs["id"],由于返回的是列表,所以要变成字符串输出
print(soup.link.attrs["href"])
print(soup.select('link')[0].attrs["href"])
#get_text获取标签里边的文本,也是列表要加序列号
for each in soup.select("a"):
print(each.get_text())
if __name__ == "__main__":
url = "http://www.quannovel.com/read/11/2588.html"
get_url(url)
|