专栏首页Golang开发Python爬虫——XPath

Python爬虫——XPath

XPath

表达式

描述

nodename

选取此节点的所有子节点

/

从根节点选取

//xxx

从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置

.

选取当前节点

..

选取当前节点的父节点

@xxx

选取属性内容

/text()

选取文本内容

starts-with(@属性名称,属性字符相同部分)

以相同字符开始

演示使用HTML内容

html = '''
<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title>测试-常规用法</title>
</head>
<body>
<div id="content">
    <ul id="test1">
        <li>这是第一条信息</li>
        <li>这是第二条信息</li>
        <li>这是第三条信息</li>
    </ul>
    <ul id="test2">
        <li>这是第4条信息</li>
        <li>这是第5条信息</li>
        <li>这是第6条信息</li>
    </ul>
    <div id="url">
        <a href="http://www.baidu.com">百度</a>
        <a href="http://www.163.com" title="Netease">网易</a>
    </div>
</div>
</body>
</html>
'''

lxml库

from lxml import etree
selector = etree.HTML()
content = selector.xpath()

/代表根节点开始的逐层获取

from lxml import etree
selector = etree.HTML(html)
content = selector.xpath('/html/head/title/text()')
print(content)

获取所有的li标签

selector = etree.HTML(html)
content = selector.xpath('//li')
for c in content:
    print(c)

获取所有title属性的值

selector = etree.HTML(html)
content = selector.xpath('//@title')
for c in content:
    print(c)

[]获取列表的index

selector = etree.HTML(html)
content = selector.xpath('//ul[2]/li[1]/text()')
for c in content:
    print(c)
# 这是第4条信息

获取所有的li的文本内容,无论在什么位置

selector = etree.HTML(html)
content = selector.xpath('//li/text()')
for c in content:
    print(c)

image.png

获取属性id=url的div下层的a标签所有href地址

selector = etree.HTML(html)
content = selector.xpath('//div[@id="url"]/a/@href')
for c in content:
    print(c)

获取属性class="test1"的ul下层的最后一个li标签的文本内容

selector = etree.HTML(html)
content = selector.xpath('//ul[@class="test1"]/li[last()]/text()')
print(content)

获取所有含有id属性且值为test1的ul下层li的文字内容

selector = etree.HTML(html)
content = selector.xpath('//ul[@id="test1"]/li/text()')
for c in content:
    print(c)

豆瓣读书250数据抓取

<table width="100%">
    <tbody><tr class="item">
        <td width="100" valign="top">
            <a class="nbg" href="https://book.douban.com/subject/25862578/" onclick="moreurl(this,{i:'1'})">
                <img src="https://img3.doubanio.com/view/subject/m/public/s27264181.jpg" width="90">
            </a>
        </td>
        <td valign="top">
            <div class="pl2">
                <a href="https://book.douban.com/subject/25862578/" onclick="&quot;moreurl(this,{i:'1'})&quot;" title="解忧杂货店">
                    解忧杂货店
                </a>
                <br>
                <span style="font-size:12px;">ナミヤ雑貨店の奇蹟</span>
            </div>
            <p class="pl">[日] 东野圭吾 / 李盈春 / 南海出版公司 / 2014-5 / 39.50元</p>
            <div class="star clearfix">
                <span class="allstar45"></span>
                <span class="rating_nums">8.6</span>
                <span class="pl">(
                    294790人评价
                )</span>
            </div>           
            <p class="quote" style="margin: 10px 0; color: #666">
                <span class="inq">一碗精心熬制的东野牌鸡汤,拒绝很难</span>
            </p>
        </td>
    </tr>
</tbody></table>

image.png

import requests
from lxml import etree

headers={
    'Accept':'*/*',
    'Accept-Encoding':'gzip, deflate',
    'Accept-Language':'zh-CN,zh;q=0.8',
    'Connection':'keep-alive',
    'Origin':'https://book.douban.com',
    'Referer':'https://book.douban.com/',
    'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.221 Safari/537.36 SE 2.X MetaSr 1.0'
}
for i in range(0, 10):
    url = 'https://book.douban.com/top250?start={}'.format(i * 25)
    html = requests.get(url, headers=headers).content
    sel = etree.HTML(html)
    tables = sel.xpath('//div[@class="indent"]/table')
    for table in tables:
        item = table.xpath('tr[@class="item"]/td[@valign="top"][2]')
        print(item[0].xpath('div[@class="pl2"]/a/@title')[0])
        print(item[0].xpath('p[@class="pl"]/text()')[0])
        quote = item[0].xpath('p[@class="quote"]/span/text()')
        if quote:
            print([0])

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Python爬虫——Beautiful Soup

    Beautiful Soup是Python处理HTML或XML的解析库,使用Beautiful Soup需要安装Beautiful Soup库和lxml的库 ...

    羊羽shine
  • RDD操作——文件数据读写

    要加载本地文件,必须采用“file:///”开头的这种格式。执行上上面这条命令以后,并不会马上显示结果,因为,Spark采用惰性机制,只有遇到“行动”类型的操作...

    羊羽shine
  • Python爬虫——Scrapy简介

    Scrapy Engine(引擎):Scrapy框架的核心部分。负责在Spider和ItemPipeline、Downloader、Scheduler中间通信、...

    羊羽shine
  • IE7下当position:fixed遇到text-align:center

    啥也不说,先看代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http...

    菩提树下的杨过
  • 推荐两个不错的flink项目

    最近flink真是风生水起,但是浪院长看来这不过是阿里错过了创造spark影响力之后,想要在flink领域创建绝对的影响力。但是,不可否认flink在实时领域确...

    Spark学习技巧
  • 原来还有一种空格叫 "NBSP"

    最近在用 Node 的 cheerio 类库整一个抓取课表的小爬虫,其中有部分不需要的信息的 HTML 标签内部只有一个 &nbsp;,我想利用它作为特征来过滤...

    zgq354
  • Python-数据解析-lxml库-下

    ElementTree 类中附带了一个类似于 XPath 路径语言的 ElementPath 类。

    小团子
  • vscode中的vue文件中emmet进行tab键不起作用的解决办法

    飞奔去旅行
  • python3解析库lxml

    lxml是python的一个解析库,支持HTML和XML的解析,支持XPath解析方式,而且解析效率非常高

    嘘、小点声
  • 不用加减乘除做加法

    题目:写一个函数,求两个整数之和,要求在函数体内不得使用+、-、×、÷四则运算符号。 分析: 第一步:不考虑进位对每一位相加。0加0、1加1的结果都是0,0加1...

    猿人谷

扫码关注云+社区

领取腾讯云代金券