1. 程式人生 > >python html抓取,並用re正則表示式解析(二)

python html抓取,並用re正則表示式解析(二)

需求:
url: “http://search.jd.com/Search?keyword=幼貓貓糧&enc=utf-8#filter
給出一個jd_search(keyword)方法,keyword為你要查詢的東西,比如:貓糧、手機,替換上面url中的keyword,得到一個新網頁。用正則表示式解析此網頁,得到每個物品的圖片、標題、價格、連結,組成一個字典,最後將所有物品的資訊放在一個列表中。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import urllib.request
import re

'''
url = "http://search.jd.com/Search?keyword=%E5%B9%BC%E7%8C%AB%E7%8C%AB%E7%B2%AE&enc=utf-8#filter"

print jd_search(keyword)

[dict,dict,dict]
dict {pic:'',title:'',price:'',url:''}
'''
def jd_search(keyword): #因為keyword是中文,所以需要先對中文進行轉換 keyword = urllib.parse.quote(keyword) url = "http://search.jd.com/Search?keyword={}&enc=utf-8#filter".format(keyword) result = [] content = urllib.request.urlopen(url).read() content_data = content.decode('utf-8') pattern = re.compile
(r'<li.*?data-sku="\d+".*?>.*?<div class="p-commit">',re.S) basic_content = re.finditer(pattern,content_data) for i in basic_content: init_dict = {} match_content = re.match(r'.*?<div class="p-img">.*?source-data-lazy-img="(.*?)".*?<div class="p-price">.*?<em>(.*?)</em><i>(.*?)</i></strong>.*?<div class="p-name p-name-type-2">.*?title="(.*?)" href="(.*?)".*?<div class="p-commit">'
,i.group(),re.S) init_dict['pic'] = match_content.group(1) init_dict['title'] = match_content.group(4) init_dict['price'] = match_content.group(2) + match_content.group(3) init_dict['url'] = 'http' + match_content.group(5) result.append(init_dict) return (result)

測試

print (jd_search('幼貓貓糧'))
print (jd_search('充電器'))