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)

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/m0_43432638/article/details/84678095