爬取古诗文网首页的所有诗文的名称
网页的地址是:https://so.gushiwen.org/gushi/tangshi.aspx
上面就是网页源码经过浏览器渲染之后的样子
在上面的页面,点击鼠标右键,点击查看网页源码或者View Page source,向下滑动就可以看到:
我们就是要提取上面网页源码中的所有诗词的名称,下面看下面代码,有详细的代码解释
用正则表达式提取文字
from urllib import request
import re
# urllib是进行Python爬虫一个非常重要的库,它可以用来发送各种请求
url = 'https://so.gushiwen.org/gushi/tangshi.aspx' # 资源的所在位置
response = request.urlopen(url)
'''
该函数是向url所在的服务器发送请求,返回的response是服务器返回的一个响应对象
因为无论是浏览器还是代码向服务器发送一个请求,都需要服务器返回一个响应,得到响应就是
我们发送请求的目的
'''
html = response.read() #这个read函数就是将从服务器得到的东西(如二进制文件,html,json文件)以字符串的形式返回
# 但是需要注意这里的字符串都是byte类型的字符串,因此需要进行解码 如果此处不明白作者会在本博客最下部进行解释
html = html.decode("utf-8")
# 这样之后html才是我们正常使用的字符串了
# 既然是字符我们就可以使用正则表达式进行解析
titles = re.findall(r'target="_blank">([\u4e00-\u9fa5]+)</a>', html)
for title in titles[1:]: # 因为得到的第一个不是诗文的名称,所以从第二个开始打印
print(title)
用Beautifulsoup解析html源码
在网页上右击点击检查得到如下照片
所有的诗词都在结点a中
from urllib import request
from bs4 import BeautifulSoup
# BeautifulSoup是用来解析网页源码非常好的一个库
# urllib是进行Python爬虫一个非常重要的库,它可以用来发送各种请求
url = 'https://so.gushiwen.org/gushi/tangshi.aspx' # 资源的所在位置
response = request.urlopen(url)
'''
该函数是向url所在的服务器发送请求,返回的response是服务器返回的一个响应对象
因为无论是浏览器还是代码向服务器发送一个请求,都需要服务器返回一个响应,得到响应就是
我们发送请求的目的
'''
html = response.read() #这个read函数就是将从服务器得到的东西(如二进制文件,html,json文件)以字符串的形式返回
# 但是需要注意这里的字符串都是byte类型的字符串,因此需要进行解码 如果此处不明白作者会在本博客最下部进行解释
html = html.decode("utf-8")
# 这样之后html才是我们正常使用的字符串了
# 既然是字符我们就可以使用正则表达式进行解析
soup = BeautifulSoup(html,"lxml") # 用lxml方式解析html,得到结果对象
nodes = soup.find_all('a',attrs={'target':"_blank"})
# 找到所有a结点,由于部分a结点可能不满足要求所以需要根据结点a的属性进行筛选,根据结点a的属性来筛选
# 根据网页检查得到信息可知'target'满足其等于"_blank"
for x in nodes[1:]: # 第一个结点不满足
# print(x.get_text()) # 得到该结点的字符串文字 或者下面的方式也可以
# print(x.string)
print(x.contents[0])
用xpath方法提取字符串文字
from urllib import request
from lxml import etree
# etree是用来解析xml文件很好的库,也可以解析html
# urllib是进行Python爬虫一个非常重要的库,它可以用来发送各种请求
url = 'https://so.gushiwen.org/gushi/tangshi.aspx' # 资源的所在位置
response = request.urlopen(url)
'''
该函数是向url所在的服务器发送请求,返回的response是服务器返回的一个响应对象
因为无论是浏览器还是代码向服务器发送一个请求,都需要服务器返回一个响应,得到响应就是
我们发送请求的目的
'''
html = response.read() #这个read函数就是将从服务器得到的东西(如二进制文件,html,json文件)以字符串的形式返回
# 但是需要注意这里的字符串都是byte类型的字符串,因此需要进行解码 如果此处不明白作者会在本博客最下部进行解释
html = html.decode("utf-8")
# 这样之后html才是我们正常使用的字符串了
# 既然是字符我们就可以使用正则表达式进行解析
HTML = etree.HTML(html) # 根据字符串得到etree的结构树
titles = HTML.xpath('/html/body//div[@class="typecont"]//span/a/text()') # 利用xpath规则来得到信息
# 读者自己需要先行学习xpath规则
for x in titles:
print(x)
下面就来解释一下Python中的编码和字符串:
# 常见的编码法有utf-8, utf-16, gbk, gbg2312等等
# python中的字符串有两种字符串一个是bytes和unicode字符串
# unicode字符串需要经过编码(encode)变成bytes类型字符串
# bytes类型字符串需要经过解码(decode)变成unicode字符串
demo_string1 = b'zhongguo' # bytes字符串只能含有ACSII码能表示的字符,不能含有中文
demo_string2 = 'zhongguo'
print(demo_string1)
print(demo_string2)
print(type(demo_string1))
print(type(demo_string2))
print(demo_string1.decode("utf-8", "ignore")) # 以utf-8编码方式节解码,忽略不能解码的地方(第二个参数的作用)
print(demo_string2.encode("utf-8", "ignore")) # 以utf-8编码方式节编码,忽略不能编码的地方(第二个参数的作用)