Python爬虫笔记(二)

使用lxml中的语法,利用etree进行解析html文件,将其转换为etree语法。
Xpath语法:
例如获得了html中的文字,现在要处理文字中的逻辑,使用可以使用lxml中。

from lxml import etree
parser = etree.HTMLParser(encoding='utf-8')
html = etree.parse("tencent.html",parser=parser)

之后获取解析后的html文件进行数据处理
获取html有两种方法:
一种是获取本地文件,使用etree中的parse方法进行本地文件处理

html = etree.parse("tencent.html",parser=parser)

第二种是利用etree中的HTML方法,这种方法可以将requests.get(url)中获取到的字符串进行处理:

htmlElement = etree.HTML(text)
print(etree.tostring(htmlElement,encoding='utf-8').decode("utf-8"))

然后对获取的数据进行数据提取,

# #1.获取所有的tr标签
# #xpath函数获取的是一个列表
# trs = html.xpath("//tr")
# for tr in trs:
#     print(etree.tostring(tr,encoding='utf-8').decode('utf-8'))

#
# 2.获取第二个标签
# trs  = html.xpath("//tr[2]")[0]
# print(etree.tostring(trs,encoding='utf-8').decode('utf-8'))

# #3.获取所有class等于even的tr标签
# trs = html.xpath("//tr[@class = 'even']")
# for tr in trs:
#     print(etree.tostring(tr,encoding='utf-8').decode('utf-8'))


# #4.获取所有a标签的href值
# trs = html.xpath("//a/@href")
# for tr in trs:
#     print(tr)

这里具体有几种方法:
1.直接获取tr标签,输出是带着tr标签一起输出
2.获取指定标签(一个),主要是利用了列表中的下表标进行提取
3.通过class等属性获取具体标签,可以更方便获取属性
4.获取指定值,一般这个比较常用,用来提取链接,通过/@加属性名可以获取具体属性的值
最后输出结果

<tr class="h">&#13;
            <td class="l" width="374">职位名称</td>&#13;
            <td>职位类别</td>&#13;
            <td>人数</td>&#13;
            <td>地点</td>&#13;
            <td>发布时间</td>&#13;
        </tr>&#13;
        
<tr class="even">&#13;
            <td class="l square"><a target="_blank" href="position_detail.php?id=33824&amp;keywords=python&amp;tid=87&amp;lid=2218">22989-金融云区块链高级研发工程师(深圳)</a></td>&#13;
            <td>技术类</td>&#13;
            <td>1</td>&#13;
            <td>深圳</td>&#13;
            <td>2017-11-25</td>&#13;
        </tr>&#13;
        
<tr class="odd">&#13;
            <td class="l square"><a target="_blank" href="position_detail.php?id=29938&amp;keywords=python&amp;tid=87&amp;lid=2218">22989-金融云高级后台开发</a></td>&#13;
            <td>技术类</td>&#13;
            <td>2</td>&#13;
            <td>深圳</td>&#13;
            <td>2017-11-25</td>&#13;
        </tr>&#13;
        
<tr class="even">&#13;
            <td class="l square"><a target="_blank" href="position_detail.php?id=31236&amp;keywords=python&amp;tid=87&amp;lid=2218">SNG16-腾讯音乐运营开发工程师(深圳)</a></td>&#13;
            <td>技术类</td>&#13;
            <td>2</td>&#13;
            <td>深圳</td>&#13;
            <td>2017-11-25</td>&#13;
        </tr>&#13;
        
<tr class="odd">&#13;
            <td class="l square"><a target="_blank" href="position_detail.php?id=31235&amp;keywords=python&amp;tid=87&amp;lid=2218">SNG16-腾讯音乐业务运维工程师(深圳)</a></td>&#13;
            <td>技术类</td>&#13;
            <td>1</td>&#13;
            <td>深圳</td>&#13;
            <td>2017-11-25</td>&#13;
        </tr>&#13;
        
<tr class="even">&#13;
            <td class="l square"><a target="_blank" href="position_detail.php?id=34531&amp;keywords=python&amp;tid=87&amp;lid=2218">TEG03-高级研发工程师(深圳)</a></td>&#13;
            <td>技术类</td>&#13;
            <td>1</td>&#13;
            <td>深圳</td>&#13;
            <td>2017-11-24</td>&#13;
        </tr>&#13;
        
<tr class="odd">&#13;
            <td class="l square"><a target="_blank" href="position_detail.php?id=34532&amp;keywords=python&amp;tid=87&amp;lid=2218">TEG03-高级图像算法研发工程师(深圳)</a></td>&#13;
            <td>技术类</td>&#13;
            <td>1</td>&#13;
            <td>深圳</td>&#13;
            <td>2017-11-24</td>&#13;
        </tr>&#13;
        
<tr class="even">&#13;
            <td class="l square"><a target="_blank" href="position_detail.php?id=31648&amp;keywords=python&amp;tid=87&amp;lid=2218">TEG11-高级AI开发工程师(深圳)</a></td>&#13;
            <td>技术类</td>&#13;
            <td>4</td>&#13;
            <td>深圳</td>&#13;
            <td>2017-11-24</td>&#13;
        </tr>&#13;
        
<tr class="odd">&#13;
            <td class="l square"><a target="_blank" href="position_detail.php?id=32218&amp;keywords=python&amp;tid=87&amp;lid=2218">15851-后台开发工程师</a></td>&#13;
            <td>技术类</td>&#13;
            <td>1</td>&#13;
            <td>深圳</td>&#13;
            <td>2017-11-24</td>&#13;
        </tr>&#13;
        
<tr class="even">&#13;
            <td class="l square"><a target="_blank" href="position_detail.php?id=32217&amp;keywords=python&amp;tid=87&amp;lid=2218">15851-后台开发工程师</a></td>&#13;
            <td>技术类</td>&#13;
            <td>1</td>&#13;
            <td>深圳</td>&#13;
            <td>2017-11-24</td>&#13;
        </tr>&#13;
        
<tr class="odd">&#13;
            <td class="l square"><a target="_blank" href="position_detail.php?id=34511&amp;keywords=python&amp;tid=87&amp;lid=2218">SNG11-高级业务运维工程师(深圳)</a></td>&#13;
            <td>技术类</td>&#13;
            <td>1</td>&#13;
            <td>深圳</td>&#13;
            <td>2017-11-24</td>&#13;
        </tr>&#13;
    
<tr class="even">&#13;
            <td class="l square"><a target="_blank" href="position_detail.php?id=33824&amp;keywords=python&amp;tid=87&amp;lid=2218">22989-金融云区块链高级研发工程师(深圳)</a></td>&#13;
            <td>技术类</td>&#13;
            <td>1</td>&#13;
            <td>深圳</td>&#13;
            <td>2017-11-25</td>&#13;
        </tr>&#13;
        
<tr class="even">&#13;
            <td class="l square"><a target="_blank" href="position_detail.php?id=33824&amp;keywords=python&amp;tid=87&amp;lid=2218">22989-金融云区块链高级研发工程师(深圳)</a></td>&#13;
            <td>技术类</td>&#13;
            <td>1</td>&#13;
            <td>深圳</td>&#13;
            <td>2017-11-25</td>&#13;
        </tr>&#13;
        
<tr class="even">&#13;
            <td class="l square"><a target="_blank" href="position_detail.php?id=31236&amp;keywords=python&amp;tid=87&amp;lid=2218">SNG16-腾讯音乐运营开发工程师(深圳)</a></td>&#13;
            <td>技术类</td>&#13;
            <td>2</td>&#13;
            <td>深圳</td>&#13;
            <td>2017-11-25</td>&#13;
        </tr>&#13;
        
<tr class="even">&#13;
            <td class="l square"><a target="_blank" href="position_detail.php?id=34531&amp;keywords=python&amp;tid=87&amp;lid=2218">TEG03-高级研发工程师(深圳)</a></td>&#13;
            <td>技术类</td>&#13;
            <td>1</td>&#13;
            <td>深圳</td>&#13;
            <td>2017-11-24</td>&#13;
        </tr>&#13;
        
<tr class="even">&#13;
            <td class="l square"><a target="_blank" href="position_detail.php?id=31648&amp;keywords=python&amp;tid=87&amp;lid=2218">TEG11-高级AI开发工程师(深圳)</a></td>&#13;
            <td>技术类</td>&#13;
            <td>4</td>&#13;
            <td>深圳</td>&#13;
            <td>2017-11-24</td>&#13;
        </tr>&#13;
        
<tr class="even">&#13;
            <td class="l square"><a target="_blank" href="position_detail.php?id=32217&amp;keywords=python&amp;tid=87&amp;lid=2218">15851-后台开发工程师</a></td>&#13;
            <td>技术类</td>&#13;
            <td>1</td>&#13;
            <td>深圳</td>&#13;
            <td>2017-11-24</td>&#13;
        </tr>&#13;
        
position_detail.php?id=33824&keywords=python&tid=87&lid=2218
position_detail.php?id=29938&keywords=python&tid=87&lid=2218
position_detail.php?id=31236&keywords=python&tid=87&lid=2218
position_detail.php?id=31235&keywords=python&tid=87&lid=2218
position_detail.php?id=34531&keywords=python&tid=87&lid=2218
position_detail.php?id=34532&keywords=python&tid=87&lid=2218
position_detail.php?id=31648&keywords=python&tid=87&lid=2218
position_detail.php?id=32218&keywords=python&tid=87&lid=2218
position_detail.php?id=32217&keywords=python&tid=87&lid=2218
position_detail.php?id=34511&keywords=python&tid=87&lid=2218

这里要注意的是在浏览器中解析时会在前面自动加上头域名,但是爬虫不会,所以需要自己加入

# xpath语法:

## 使用方式:
使用//获取整个页面当中的元素,然后写标签名,然后再写谓词进行提取。比如:
```
//div[@class='abc']
```

## 需要注意的知识点:
1. /和//的区别:/代表只获取直接子节点。//获取子孙节点。一般//用得比较多。当然也要视情况而定。
2. contains:有时候某个属性中包含了多个值,那么可以使用`contains`函数。示例代码如下:
    ```
    //div[contains(@class,'job_detail')]
    ```
3. 谓词中的下标是从1开始的,不是从0开始的。

## 使用lxml解析HTML代码:
1. 解析html字符串:使用`lxml.etree.HTML`进行解析。示例代码如下:
    ```python
    htmlElement = etree.HTML(text)
    print(etree.tostring(htmlElement,encoding='utf-8').decode("utf-8"))
    ```
2. 解析html文件:使用`lxml.etree.parse`进行解析。示例代码如下:
    ```python
    htmlElement = etree.parse("tencent.html")
    print(etree.tostring(htmlElement, encoding='utf-8').decode('utf-8'))
    ```
    这个函数默认使用的是`XML`解析器,所以如果碰到一些不规范的`HTML`代码的时候就会解析错误,这时候就要自己创建`HTML`解析器。
    ```python
    parser = etree.HTMLParser(encoding='utf-8')
    htmlElement = etree.parse("lagou.html",parser=parser)
    print(etree.tostring(htmlElement, encoding='utf-8').decode('utf-8'))
    ```

    ## lxml结合xpath注意事项:
    1. 使用`xpath`语法。应该使用`Element.xpath`方法。来执行xpath的选择。示例代码如下:
        ```python
        trs = html.xpath("//tr[position()>1]")
        ```
    `xpath函数`返回来的永远是一个列表。
    2. 获取某个标签的属性:
        ```python
        href = html.xpath("//a/@href")
        # 获取a标签的href属性对应的值
        ```
    3. 获取文本,是通过`xpath`中的`text()`函数。示例代码如下:
        ```python
        address = tr.xpath("./td[4]/text()")[0]
        ```
    4. 在某个标签下,再执行xpath函数,获取这个标签下的子孙元素,那么应该在斜杠之前加一个点,代表是在当前元素下获取。示例代码如下:
        ```python
         address = tr.xpath("./td[4]/text()")[0]
        ```
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

月光如春风拂面

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值