以下是本人基于上课所学的的内容浓缩而成的一篇代码。 主要介绍了get网页请求,BeautifulSoup网页解析,Xpath网页解析,正则表达式网页解析。 2021/12/8首发于csdn,有错误和不足欢迎指出
'''
http协议使用了请求/响应模型,爬虫作为客户端模拟发起请求,服务器做出响应
连接web服务器,爬虫发送http请求,服务器接收请求并返回htttp响应,释放TCP连接,爬虫解析HTML内容
正是因为连接会被关闭,所以需要使用cookie(以键值对形式保存)对用户历史操作(如表单密码的提交)进行记录
'''
import requests
import chardet
from bs4 import BeautifulSoup
from lxml import etree
import re
url = "http://www.tipdm.com/"
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) \
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.55 Safari/537.36 Edg/96.0.1054.41"}
timeout1 = 2
timeout2 = 0.001
'''get请求'''
rqg = requests.get(url, headers=headers, timeout=timeout1)
print("结果类型:", type(rqg))
print("状态码:", rqg.status_code)
print("编码:", rqg.encoding)
print("detect方法检测结果:", chardet.detect(rqg.content))
rqg.encoding = chardet.detect(rqg.content)['encoding']
print("改变后的编码:", rqg.encoding)
print("响应头:", rqg.headers)
html = rqg.content.decode("utf-8")
'''BeautifulSoup解析网页'''
soup = BeautifulSoup(html, "lxml")
tag = soup.ul
print("tag第一个标签的名字(其实已经知道是ul了):", tag.name)
print("tag第一个标签的属性及取值:", tag.attrs)
print("tag里第一个li标签块的内容:", tag.li)
print("tag里第一个li的文字内容:", tag.li.text)
print("tag里第一个li的文字内容:", tag.li.string)
print("tag.text,tag.li.get_text()和tag.string对象类型:", type(tag.li.text), type(tag.li.get_text()), type(tag.li.string))
print("查找第一个ul块:", soup.find("ul"))
print("查找所有的class='menu'的ul块,结果为一个列表,如果找不到就为空列表。\
注意写法是class_,不是class,id还是原来那样写:", soup.find_all("ul", class_='menu'))
s1 = soup.find_all('ul')
print("切片结果:", s1[0:2])
for t in soup.ul.find_all("a"):
print(t.get_text(), t.get("herf"), end="\n")
'''Xpath解析网页'''
xp = etree.HTML(html, parser=etree.HTMLParser(encoding='utf-8'))
print("所有的a标记,不管在什么位置", xp.xpath("//a"))
print("body/div里的第一个a结点", xp.xpath("body/div/a[1]"))
print("body/div里的最后一个a结点", xp.xpath("body/div/a[last()]"))
print("body/div里的倒数第二个a结点", xp.xpath("body/div/a[last()-1]"))
print("body/div里的前两个a结点", xp.xpath("body/div/a[position()<3]"))
print("body里所有class属性值为container clearfix的div结点", xp.xpath("body/div[@class='container clearfix']"))
print("body里所有div下所有的内容:", xp.xpath("body/div/*"))
print("body里所有带有属性的前两个div结点", xp.xpath("body/div[@* and position()<3]"))
print("body里所有id值以co开头的div结点", xp.xpath("body/div[starts-with(@id,'co')"))
print("head里所有的title的文本内容:", xp.xpath("head/title/text()"))
r2 = xp.xpath("//p[starts-with(@class,'p1')]")
for j in r2:
t2 = j.xpath('string(.)')
print(t2)
'''正则表达式解析网页'''
|