python爬虫入门

Posted 临风而眠

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python爬虫入门相关的知识,希望对你有一定的参考价值。

python爬虫入门(8)

​ Xpath语法入门

​ Xpath用于在XML文档中搜索内容

html是xml中的一个子集

一.Xpath简介

​ 准备工作:

​ pip install lxml

​ lxml是一种解析器

1.何为Xpath

  • 解析XML的一种语言(HTML其实是XML的子级),广泛用于解析HTML数据
  • 几乎所有语言都能使用XPath,比如Java和c语言

2.Xpath解析原理

  • 实例化一个etree对象,且需要将被解析的页面源码加载到数据对象中

    • 将本地的html文档中的源码数据加载到etree对象中:etree.parse(filePath)

    • 将网上获取的源码加载到对象中:etree.HTML('page_text')

      ​ 解析XML文档:etree.XML

  • 调用etree对象中的Xpath方法结合Xpath表达式实现标签的定位和内容的捕获

    • xpath(‘xpath表达式’)

3.Xpath语法

  • 层级: /直接子级 、 //跳级(子孙后代)

  • 属性:@属性访问

    ​ 节点上的属性

  • 函数: contains()text()

二.示例

1.XML

导入一个同目录下的xml文件来解析:

<book>

    <id>l</id>
    <name>东京奥运会</name>
    <price>1.23</price>
    <nick>接地府</nick>
    <author>
        <nick id="10086">体操</nick>
        <nick id="10010">乒乓球</nick>
        <nick class="joy">犯规</nick>
        <nick class="jolin">金牌</nick>
        <div>
            <nick>黑幕</nick>
        </div>
    </author>
    <partner>
         <nick id="ppc">得意忘形</nick>
         <nick id="ppbc">厚颜无耻</nick>
    </partner>
</book>

​ 我将之命名为2.xml

  • 检验对象是否能检测到结点
from lxml import etree

tree = etree.parse('2.xml')
result=tree.xpath('/book')
print(result)

运行结果 : [<Element book at 0x1f1569adf40>]

  • 提取”东京奥运会“

    ​ text()方法是提取文本

result=tree.xpath('/book/name/text()')
print(result)

运行结果 : ['东京奥运会']

  • 提取nick里面的文字

比较下面几个:

result=tree.xpath('/book/nick/text()')
print(result)

运行结果:[‘接地府’]

result=tree.xpath('/book/author/nick/text()')
print(result)

运行结果:[‘体操’, ‘乒乓球’, ‘犯规’, ‘金牌’]

result=tree.xpath('/book//nick/text()')
print(result)

运行结果:[‘接地府’, ‘体操’, ‘乒乓球’, ‘犯规’, ‘金牌’, ‘黑幕’, ‘得意
忘形’, ‘厚颜无耻’]

result=tree.xpath('/book/author//nick/text()')
print(result)

运行结果:[‘体操’, ‘乒乓球’, ‘犯规’, ‘金牌’, ‘黑幕’]

​ 此时修改一下XML

改为:

<book>

    <id>l</id>
    <name>东京奥运会</name>
    <price>1.23</price>
    <nick>接地府</nick>
    <author>
        <nick id="10086">体操</nick>
        <nick id="10010">乒乓球</nick>
        <nick class="joy">犯规</nick>
        <nick class="jolin">金牌</nick>
        <div>
            <nick>黑幕</nick>
        </div>
        <span>
            <nick>君子</nick>
        </span>
    </author>
    <partner>
         <nick id="ppc">得意忘形</nick>
         <nick id="ppbc">厚颜无耻</nick>
    </partner>
</book>

此时想要提取 ’黑幕‘,’君子‘该怎么做?

​ 使用通配符*,表示任意结点

result=tree.xpath('/book/author/*/nick/text()')
print(result)

运行结果:[‘黑幕’, ‘君子’]

​ 注:若将xml文档放入程序,则用etree.XML()来解析

from lxml import etree

xml = """
<book>

    <id>l</id>
    <name>东京奥运会</name>
    <price>1.23</price>
    <nick>接地府</nick>
    <author>
        <nick id="10086">体操</nick>
        <nick id="10010">乒乓球</nick>
        <nick class="joy">犯规</nick>
        <nick class="jolin">金牌</nick>
        <div>
            <nick>黑幕</nick>
        </div>
        <span>
            <nick>君子</nick>
        </span>
    </author>
    <partner>
         <nick id="ppc">得意忘形</nick>
         <nick id="ppbc">厚颜无耻</nick>
    </partner>
</book>

"""

tree = etree.XML(xml)
result = tree.xpath('/book/author//nick/text()')
print(result)

2.HTML

把以下保存为一个HTML文件

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8"/>
    <title>Title</title>
</head>
<body>
    <ul>

        <li><a href="http://www.baidu.com">百度</a></li>
        <li><a href="http://www.google.com">谷歌</a></li>
        <li><a href="http://www.sogou.com">搜狗</a></li>
    </ul>
    <ol>
        <li><a href="feijii">飞机</a></li>
        <li><a href="dapao">大炮</a></li>
        <li><a href="huoche">火车</a></li>
    </ol>
    <div class="job">李嘉诚</div>
    <div class="common">胡辣汤</div>
</body>
</html>
  • 提取里面的百度、谷歌、搜狗这几个文字
from lxml import etree

tree = etree.parse('a.html')
result=tree.xpath('/html/body/ul/li/a/text()')
print(result)

若不想全都提取,想只提取某一个呢?

​ 用索引,这里是从1开始,不是从0开始

result1 、result2 、 result3 分别是百度 谷歌 搜狗

result1 = tree.xpath('/html/body/ul/li[1]/a/text()')
result2 = tree.xpath('/html/body/ul/li[2]/a/text()')
result3 = tree.xpath('/html/body/ul/li[3]/a/text()')
  • 根据属性提取,如根据href=‘dapao’提取 大炮 文字
result = tree.xpath("/html/body/ol/li/a[@href='dapao']/text()")
print(result)
# 浏览器里复制的Xpath:/html/body/ol/li[2]/a

​ 注意根节点前面的/别忘!!!

  • 遍历<li>
ol_li_list=tree.xpath('/html/body/ol/li')
for li in ol_li_list:
    print(li)

运行结果

<Element li at 0x19ab42810c0>
<Element li at 0x19ab4281200>
<Element li at 0x19ab4281240>

若要从每一个li中提取文字,则要在每一个li中继续使用Xpath

此时是相对查找,用==./==(./表示当前结点),实现方法如下:

ol_li_list=tree.xpath('/html/body/ol/li')
for li in ol_li_list:
    content=li.xpath('./a/text()')
    print(content)

若要提取a标签的href属性的值呢?

ol_li_list=tree.xpath('/html/body/ol/li')
for li in ol_li_list:
    content=li.xpath('./a/@href')
    print(content)

一半提取ul和ol里面的a标签的属性的值:

print(tree.xpath('/html/body/*/li/a/@href'))

运行结果

['http://www.baidu.com', 'http://www.google.com', 'http://www.sogou.com', 'feiji', 'dapao', 'huoche']

小技巧:

可以直接在检查页面复制Xpath

以上是关于python爬虫入门的主要内容,如果未能解决你的问题,请参考以下文章

python爬虫入门

如何入门 Python 爬虫?

python网络爬虫入门

python爬虫入门

如何入门 Python 爬虫

python爬虫如何入门