您的位置:首页 > 其它

爬虫基础 --xpath和lxml(解析网页信息)

2018-03-23 18:41 465 查看

xpath

-可以提取xml和html网页中的数据的语言

xpath语法

xpath helper插件:帮助我们从”elements”中定位数据

1.选择节点(便签)

/html/head/meta :能够选中html下head下所有的meta标签

2.// :能够从任意节点开始选择

//li 表示当前所有页面中的标签

/html/head//link :head下的所有link标签

3.@符号的用途

–选择具体某个元素

//ul[@class=”toolbar”]/li :选择class=”toolbar”的ul下的li

–获取某一属性的值

a@/href:选择a的href的值

4.获取文本 text()

//div[@class=”w-header”]/span/text():获取span下的文本

5. ./xx当前节点下XX的标签

lxml

pip install lxml

基本用法:

from lxml import etree

element=etree.HTML(“html字符串或者xml文本”)—element对象

element.xpath()—可以使用xpath语法获取数据

”’

实例演示–糗事百科数据抓取

import requests
from lxml import etree
import json

#创建类
class QiubaiSpider():
#定义构造器
def __init__(self):
self.url_temp="https://www.qiushibaike.com/8hr/page/{}/" #通过翻页观察规律
self.headers={
"user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36"
}

#定义功能函数---得到url列表
#利用列表推导式及format方法
url_list =[self.url_temp.format(i) for i in range(1,14)]
return url_list

#定义功能函数---得到html字符串
def get_html(self,url):
print("正在对 %s 发出请求" % url)
res=requests.get(url,headers=self.headers)
return res.content.decode()

#定义功能函数---解析html字符串
def parse_html(self,html_str):
#建立element对象
html=etree.HTML(html_str)
#分组---便于for遍历取值
div_list=html.xpath("//div[@id='content-left']/div")
content_list=[]
for div in div_list:
item = {}
item["author_name"]=div.xpath(".//h2/text()")[0].strip() if len(div.xpath(".//h2/text()")) else None
item["content"]=div.xpath(".//div[@class='content']/span/text()")
item["content"]=[i.strip() for i in item["content"]]
item["img"]=div.xpath(".//img[@class='illustration']/@src")
#注意图片链接的完整性与三元运算符赋值操作
item["img"]="https:"+ item["img"][0] if len(div.xpath(".//img[@class='illustration']/@src")) else None
content_list.append(item)
return content_list

#定义功能函数---保存数据
def save_content_list(self,content_list):
with open("qiubai.txt","a",encoding="utf-8") as f:
for content in content_list:
#将python字典数据转为为json字符串
f.write(json.dumps(content,ensure_ascii=False))
f.write("\n")
print("保存成功")

#定义run方法---实现主要逻辑
def run(self):
# 1.根据url地址规律构造url_list
url_list=self.get_url_list()
# 2.发送请求,获取响应
for url in url_list:
html_str=self.get_html(url)
# 3.提取数据
content_list=self.parse_html(html_str)
# 4.保存
self.save_content_list(content_list)

if __name__ == '__main__':
qiubai=QiubaiSpider()
qiubai.run()
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  spider