Python利用xpath和正则re爬取新浪新闻

今天我们来进行简单的网络爬虫讲解:利用用from lxml import html库+Xpath以及requests库进行爬虫
1.我们将爬取新浪微博首页要闻
在这里插入图片描述我们摁F12查看网页源代码查找要闻内容所对应的HTML的代码
在这里插入图片描述通过观察我们可以发现每个标题都在<h1 data-client=“headline”>下的 a标签中,其实这个就是我们标题
2.再利用requests的库先打印出我们的网页源代码

from lxml import html
import requests
html = requests.get("https://news.sina.com.cn/")
print(html.text)

在这里插入图片描述
我们可以看得到打印的源代码内存在乱码,我们可以通过F12点击网络,并且刷新页面
在这里插入图片描述我们点击左侧的所有请求状态,再通过右侧的响应可以查看该get请求对应网页的位置,除此之外呢我么可以看到网页的代码是通过UTF-8的编码格式进行编码的
在这里插入图片描述所以我们需要进行编码成utf-8在打印出来

from lxml import html
import requests
html = requests.get("https://news.sina.com.cn/")
html.encoding = 'utf-8'
print(html.text)

在这里插入图片描述
那么现在我们就是已经将网页的源代码获取了,我们接下来就要获取到网页的内容,其实利用xpath的时候获取的内容有两部分第一个部分就是获取属性值比如标签a中href的值或者a的文本内容都是不一样的,但是需要你们了解一下XPATH的语法规则,http://www.runoob.com/xpath/xpath-syntax.html
举一个例子我们具体的去体会一下xpath:
在这里插入图片描述获取div中ul的li的a的href 的网址和a中文本内容:
在这里插入图片描述
只需要这样写就OK了现在我们就运行一下看看结把!

from lxml import html
import requests
import re
html1 = requests.get("https://news.sina.com.cn/")
html1.encoding = 'utf-8'
tree = html.fromstring(html1.content)
link = tree.xpath("//div[@class='nav-mod-1 nav-w']/ul/li/a/@href")
txt = tree.xpath("//div[@class='nav-mod-1 nav-w']/ul/li/a/text()")
for i in link:
	print(i)
for i in txt:
	print(i)

在这里插入图片描述其实除了利用xpath的方法获取外我们也可以利用requests+re正则表达式去获取我们想要的内容,这里我们不对re正则进行细致的讲解,只讲一下我们所用到的内容:
re.findall(patrten,html)该方法是在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表。
re.compile 函数
compile 函数用于编译正则表达式,生成一个正则表达式( Pattern )对象,供 match() 和 search() 这两个函数使用。
语法格式为:
在这里插入图片描述
例如我们获取这个标题文字:

from lxml import html
import requests
import re
html1 = requests.get("https://news.sina.com.cn/")
html1.encoding = 'utf-8'
# tree = html.fromstring(html1.content)
# link = tree.xpath("//div[@class='nav-mod-1 nav-w']/ul/li/a/@href")
# txt = tree.xpath("//div[@class='nav-mod-1 nav-w']/ul/li/a/text()")
patren_1 = re.compile(r'<ul>.*?<li><a.*? target="_blank">(\w+)</a></li>',re.S)
link = re.findall(patren_1,html1.text)
print(link)

在这里插入图片描述

以下是用Python的requests和xpath正则表达式爬取豆瓣电影top250详情页的代码: ```python import requests from lxml import etree import re def get_movie_details(url): # 发送请求获取页面内容 response = requests.get(url) html = response.content.decode('utf-8') # 解析页面内容 selector = etree.HTML(html) # 获取电影名称 movie_name = selector.xpath('//h1/span/text()')[0] # 获取导演和主演信息 director_and_cast = selector.xpath('//div[@id="info"]/span[1]/span[@class="attrs"]/a/text()') director = director_and_cast[0] cast = director_and_cast[1:] # 获取上映年份、地区、类型 year_country_type = selector.xpath('//div[@id="info"]/text()') year = re.findall('\d{4}', year_country_type[1])[0] country = year_country_type[2].strip().split('/')[0] type = year_country_type[2].strip().split('/')[-1] # 获取评分和评价人数 rating = selector.xpath('//strong[@class="ll rating_num"]/text()')[0] rating_num = selector.xpath('//div[@class="rating_sum"]/a/span/text()')[0] # 获取电影简介 summary = selector.xpath('//div[@class="indent"]/span[@class="all hidden"]/text()')[0] # 构造电影信息字典 movie_info = { '名称': movie_name, '导演': director, '主演': cast, '年份': year, '地区': country, '类型': type, '评分': rating, '评价人数': rating_num, '简介': summary.strip(), } return movie_info if __name__ == '__main__': urls = ['https://movie.douban.com/top250?start={}'.format(i) for i in range(0, 250, 25)] for url in urls: response = requests.get(url) html = response.content.decode('utf-8') selector = etree.HTML(html) # 获取电影详情页链接 movie_links = selector.xpath('//div[@class="hd"]/a/@href') for link in movie_links: movie_info = get_movie_details(link) print(movie_info) ``` 这段代码会爬取豆瓣电影top250列表页面中每部电影的详情页,并从详情页中提取电影名称、导演和主演、上映年份、地区、类型、评分、评价人数、电影简介等信息,并打印出来。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

拼命_小李

给点鼓励

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值