爬虫之xpath解析

一,Xpath基本语法

安装使用:

1.下载:pip install lxml
2.导包:from lxml import etree

3.将html文档或者xml文档转换成一个etree对象,然后调用对象中的方法查找指定的节点

  2.1 本地文件:tree = etree.parse(文件名)
                tree.xpath("xpath表达式")

  2.2 网络数据:tree = etree.HTML(网页内容字符串)
                tree.xpath("xpath表达式")
安装xpath插件在浏览器中对xpath表达式进行验证:可以在插件中直接执行xpath表达式
将xpath插件拖动到谷歌浏览器拓展程序(更多工具)中,安装成功

启动和关闭插件 ctrl + shift + x

测试页面数

<html lang="en">
<head>
    <meta charset="UTF-8" />
    <title>测试bs4</title>
</head>
<body>
    <div>
        <p>百里守约</p>
    </div>
    <div class="song">
        <p>李清照</p>
        <p>王安石</p>
        <p>苏轼</p>
        <p>柳宗元</p>
        <a href="http://www.song.com/" title="赵匡胤" target="_self">
            <span>this is span</span>
        宋朝是最强大的王朝,不是军队的强大,而是经济很强大,国民都很有钱</a>
        <a href="" class="du">总为浮云能蔽日,长安不见使人愁</a>
        <img src="http://www.baidu.com/meinv.jpg" alt="" />
    </div>
    <div class="tang">
        <ul>
            <li><a href="http://www.baidu.com" title="qing">清明时节雨纷纷,路上行人欲断魂,借问酒家何处有,牧童遥指杏花村</a></li>
            <li><a href="http://www.163.com" title="qin">秦时明月汉时关,万里长征人未还,但使龙城飞将在,不教胡马度阴山</a></li>
            <li><a href="http://www.126.com" alt="qi">岐王宅里寻常见,崔九堂前几度闻,正是江南好风景,落花时节又逢君</a></li>
            <li><a href="http://www.sina.com" class="du">杜甫</a></li>
            <li><a href="http://www.dudu.com" class="du">杜牧</a></li>
            <li><b>杜小月</b></li>
            <li><i>度蜜月</i></li>
            <li><a href="http://www.haha.com" id="feng">凤凰台上凤凰游,凤去台空江自流,吴宫花草埋幽径,晋代衣冠成古丘</a></li>
        </ul>
    </div>
</body>
</html>

xpath表达式:

/  代表一个
// 代表所有

属性定位:
    #找到class属性值为song的div标签
    //div[@class="song"] 
层级&索引定位:
    #找到class属性值为tang的div的直系子标签ul下的第二个子标签li下的直系子标签a
    //div[@class="tang"]/ul/li[2]/a
逻辑运算:
    #找到href属性值为空且class属性值为du的a标签
    //a[@href="" and @class="du"]
模糊匹配:
    //div[contains(@class, "ng")]
    //div[starts-with(@class, "ta")]
取文本:
    # /表示获取某个标签下的文本内容
    # //表示获取某个标签下的文本内容和所有子标签下的文本内容
    //div[@class="song"]/p[1]/text()
    //div[@class="tang"]//text()
取属性:
    //div[@class="tang"]//li[2]/a/@href
 

二 ,获取boss直聘中的职位信息

import requests
import json
from lxml import etree

url = "https://www.zhipin.com/c101010100-p100109/"
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36"
}

page_text = requests.get(url=url, headers=headers, proxies={"https":"106.12.32.43:3128"}).text
tree = etree.HTML(page_text)

li_list = tree.xpath("//div[@class='job-list']/ul/li")
job_list = []
for li in li_list:
    job_url = "https://www.zhipin.com" + li.xpath("./div/div[1]/h3/a/@href")[0]
    print(job_url)
    page_text = requests.get(url=job_url, headers=headers, proxies={"https":"106.12.32.43:3128"}).text
    tree = etree.HTML(page_text)
    company_name = tree.xpath("//*[@id='main']/div[1]/div/div/div[3]/h3/a/text()")[0]
    salary = tree.xpath("//*[@id='main']/div[1]/div/div/div[2]/div[2]/span/text()")[0]
    job_info = {
        "company_name": company_name,
        "salary": salary
    }
    job_list.append(job_info)
    print(company_name + "下载完成")

f = open("job.html", "w", encoding="utf-8") 
json.dump(job_list, f)

 

posted @ 2019-02-27 17:46  sado  阅读(296)  评论(0编辑  收藏  举报