1. 程式人生 > >Python利用xpath和正則re爬取新浪新聞

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)

在這裡插入圖片描述