获取页面内容除使用正则意外,还可以使用XPath,其原理是将html代码转换为xml格式,然后使用XPath查找html节点或元素。

选取节点

XPath使用路径表达式来选取XML文档中的节点或节点集。

常用的路径表达式见下表:

表达式 描述
nodename 选取此节点的所有子节点
/ 从根节点选取
// 从匹配选择的当前节点选择文档中的节点,不考虑其是否为子级
. 选取当前节点
.. 选取当前节点的父节点
@ 选取属性

谓语

谓语用来查找某个特定的节点或者包含某个指定的值得节点,被嵌在方括号中。

路径表达式 释义
/one/two[1] 选取属于one子元素的第一个two元素
/one/two[last()] 选取属于one子元素的最后一个two元素
/one/two[last()-1] 选取属于one子元素的倒数第二个two元素
/one/two[position()❤️] 选取最前面的两个属于one元素的子元素two元素
//one[@lang] 选取所有拥有名为lang的属性的one元素
//one[@lang='test'] 选取所有拥有值为test的lang属性的one元素
/one/two[position>10] 选取one元素的所有two元素,且其中position属性的值大于10

选取未知节点

通配符 描述
* 匹配如何元素节点
@* 匹配任何属性节点
node() 匹配任何类型节点

例:

路径表达式 结果
/one/* 选取one中所有的子元素
//* 选取文档中的所有元素
//one[@*] 选取所有带有属性的one元素

选取若干路径

可以使用管道符“|”选取若干个路径,相当于或

XPath运算符

运算符 描述
+ 加法
- 减法
* 乘法
div 除法
= 等于
!= 不等于
< 小于
<= 小于或等于
> 大于
>= 大于或等于
or
and
mod 计算余数

XPath的使用

from lxml.html import etree

# 获取到的要匹配的html字符串
html = ''
content = etree.HTML(html)
# 返回所有匹配成功的列表集合
res = content.xpath('表达式')

BeautifulSoup4的使用

和 lxml 一样,Beautiful Soup 也是一个HTML/XML的解析器,主要的功能也是如何解析和提取 HTML/XML 数据。

想使用BeautifulSoup4首先需要安装,执行pip install beautifulsoup4安装,BeautifulSoup4的使用方法如下

from bs4 import BeautifulSoup

html = """
<html><head><title>The Dormouse's story</title></head>
<body>
<p class="title" name="dromouse"><b>The Dormouse's story</b></p>
<p class="story">Once upon a time there were three little sisters; and their names were
<a href="http://example.com/elsie" class="sister" id="link1"><!-- Elsie --></a>,
<a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and
<a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
and they lived at the bottom of a well.</p>
<p class="story">...</p>
"""
soup = BeautifulSoup(html, 'lxml')
# 打开本地Html文件创建对象
# soup = BeautifulSoup(open('xxx.html')) print(soup.prettify()) # 获取标签
soup.title # 获取title
soup.p # 获取p标签
soup.a # 获取a标签 print(soup.name)
# [document] #soup 对象本身比较特殊,它的 name 即为 [document] print(soup.head.name)
# head #对于其他内部标签,输出的值便为标签本身的名称 print(soup.p.attrs)
# {'class': ['title'], 'name': 'dromouse'}
# 在这里,我们把 p 标签的所有属性打印输出了出来,得到的类型是一个字典。 print(soup.p['class']) # soup.p.get('class')
# ['title'] #还可以利用get方法,传入属性的名称,二者是等价的 soup(p['class']) = "newClass"
print(soup.p) # 可以对这些属性和内容等等进行修改
# <p class="newClass" name="dromouse"><b>The Dormouse's story</b></p> del(soup.p['class']) # 还可以对这个属性进行删除
print (soup.p)
# <p name="dromouse"><b>The Dormouse's story</b></p> # 获取标签内文字
print(soup.p.string) # tag 的 .content 属性可以将tag的子节点以列表的方式输出
print(soup.head.contents) # [<title>The Dormouse's story</title>] # .children它返回的不是一个 list(是一个列表生成器),不过我们可以通过遍历获取所有子节点。
print(soup.head.children) # <list_iterator object at 0x000002B9D7E4CFD0> # .descendants 获取所有子孙节点
print(soup.descendants) # 结果是一个生成器 <generator object Tag.descendants at 0x0000020AAC5B1B10>

BeautifulSoup4的搜索

# 使用find_all(name, attrs, recursive, text, **kwargs)查找

# 传入name参数
soup.find_all('p') # 查找所有p标签
soup.find_all('a') # 查找所有a标签
soup.find_all(re.compile('^p')) # 使用正则查找所有以p打头的标签
soup.find_all(['p', 'a']) # 传入列表,查找所有p和a标签 # 传入attrs参数
soup.find_all(id='link1') # 查找所有id未link1的标签,通过标签属性查找的方式适用大多数标签属性,包括id,style,title,但有 “-”,Class标签属性例外。
soup.find_all(attrs={'class': 'sister'}) # 传入text参数
soup.find_all(text="Lacie") # 产找所有含有内容为Lacie的对象
soup.find_all(text=['aaa', 'bbb'])
soup.find_all(text=re.compile("Tit")) # 传入正则匹配 # css选择查找
soup.select('title') # 根据标签查找
soup.select('#link1') # 根据Id查找
soup.select('.sister') # 根据类名查找
soup.select('p #link1') # 组合查找
soup.select("head > title") # 查找子标签
soup.select('a[class="sister"]') # 属性查找
soup.select('title')[0].get_text() # 使用get_text获取内容

实例

from bs4 import BeautifulSoup
from urllib.request import *
import json def tencent():
url = 'https://hr.tencent.com'
header = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36"}
request = Request(url + '/position.php?&start=0#a', headers=header)
response = urlopen(request)
html = response.read()
# with open('html.txt', 'wb+') as f:
# f.write(html) soup = BeautifulSoup(html, 'lxml')
result = soup.select('tr[class="even"]')
result2 = soup.select('tr[class="old"]')
result.extend(result2)
items = []
for site in result:
item = {}
item['name'] = site.select('td a')[0].get_text()
item['link'] = site.select('td a')[0].attrs['href']
item['category'] = site.select('td')[1].get_text()
item['recruitNumber'] = site.select('td')[2].get_text()
item['workLocation'] = site.select('td')[3].get_text()
item['publishTime'] = site.select('td')[4].get_text() items.append(item) line = json.dumps(items, ensure_ascii=False)
with open('html.txt', 'w') as f:
f.write(line) if __name__ == "__main__":
tencent()

python--爬虫(XPath与BeautifulSoup4)的更多相关文章

  1. python爬虫xpath的语法

    有朋友问我正则,,okey,其实我的正则也不好,但是python下xpath是相对较简单的 简单了解一下xpath: XPath 是一门在 XML 文档中查找信息的语言.XPath 可用来在 XML ...

  2. Python爬虫初探 - selenium+beautifulsoup4+chromedriver爬取需要登录的网页信息

    目标 之前的自动答复机器人需要从一个内部网页上获取的消息用于回复一些问题,但是没有对应的查询api,于是想到了用脚本模拟浏览器访问网站爬取内容返回给用户.详细介绍了第一次探索python爬虫的坑. 准 ...

  3. python爬虫xpath

    又是一个大晴天,因为马上要召开十九大,北京地铁就额外的拥挤,人贴人到爆炸,还好我常年挤地铁早已练成了轻功水上漂,挤地铁早已经不在话下. 励志成为一名高级测试工程师的我,目前还只是个菜鸟,难得有机会,公 ...

  4. Python爬虫 XPath语法和lxml模块

    XPath语法和lxml模块 什么是XPath? xpath(XML Path Language)是一门在XML和HTML文档中查找信息的语言,可用来在XML和HTML文档中对元素和属性进行遍历. X ...

  5. python爬虫----XPath

    1.知道本节点元素,如何定位到兄弟元素 详情见博客 XML代码见下 bt1在文档中只出现一次,所以很容易获取到bt1中内容,那怎么根据<td class='bt1'>来获取bt2中的内容 ...

  6. Python爬虫 | xpath的安装

    错误信息:程序包无效.详细信息:“Cannot load extension with file or directory name . Filenames starting with "& ...

  7. python爬虫前提技术

    1.BeautifulSoup 解析html如何使用 转自:http://blog.csdn.net/u013372487/article/details/51734047 #!/usr/bin/py ...

  8. python爬虫的页面数据解析和提取/xpath/bs4/jsonpath/正则(1)

    一.数据类型及解析方式 一般来讲对我们而言,需要抓取的是某个网站或者某个应用的内容,提取有用的价值.内容一般分为两部分,非结构化的数据 和 结构化的数据. 非结构化数据:先有数据,再有结构, 结构化数 ...

  9. python爬虫之BeautifulSoup4使用

    钢铁知识库,一个学习python爬虫.数据分析的知识库.人生苦短,快用python. 上一章我们讲解针对结构化的html.xml数据,使用Xpath实现网页内容爬取.本章我们再来聊另一个高效的神器:B ...

  10. Python爬虫与数据分析之爬虫技能:urlib库、xpath选择器、正则表达式

    专栏目录: Python爬虫与数据分析之python教学视频.python源码分享,python Python爬虫与数据分析之基础教程:Python的语法.字典.元组.列表 Python爬虫与数据分析 ...

随机推荐

  1. react-native app 屏幕适配方案(按照设计稿像素大小写就行)

    import React, { Component,PropTypes } from 'react'; import { Dimensions,PixelRatio,Platform,StatusBa ...

  2. pytest、tox、Jenkins实现python接口自动化持续集成

    pytest介绍 pytest是一款强大的python测试工具,可以胜任各种级别的软件测试工作,可以自动查找测试用并执行,并且有丰富的基础库,可以大幅度提高用户编写测试用例的效率,具备可扩展性,用户自 ...

  3. LeetCode(239.滑动窗口的最大值

    题目: 给定一个数组nums,有一个大小为k的滑动窗口从数组的最左侧移动到最右侧,你只可以看到滑动窗口内的k个数字.滑动窗口每次只向右移动一位. 返回滑动窗口中的最大值. 示例: 输入: nums = ...

  4. webpack的require.context()实现路由“去中心化”管理

    最近在开发一个大型vue单页面应用的时候,项目最初是将所有的路由写在一个router.js的文件里. const router = new Router({ mode: "history&q ...

  5. Struts UI标签的使用

    先来看一下日期控件 html5标签中其实已经有日期的类型,用<input type="date">便可调用. struts里面也自带了日期控件,其使用步骤为: 1. 导 ...

  6. 金三银四,还在为spring源码发愁吗?bean生命周期,看了这篇就够了

    第一,这绝对是一个面试高频题. 比第一还重要的第二,这绝对是一个让人爱恨交加的面试题.为什么这么说?我觉得可以从三个方面来说: 先说会不会.看过源码的人,这个不难:没看过源码的人,无论是学.硬背.还是 ...

  7. 第三届上海市大学生网络安全大赛 流量分析 WriteUp

    题目链接: https://pan.baidu.com/s/1Utfq8W-NS4AfI0xG-HqSbA 提取码: 9wqs 解题思路: 打开流量包后,按照协议进行分类,发现了存在以下几种协议类型: ...

  8. FormData/Go分片/分块文件上传

    FormData 接口提供了一种表示表单数据的键值对的构造方式,经过它的数据可以使用 XMLHttpRequest.send() 方法送出,本接口和此方法都相当简单直接.如果送出时的编码类型被设为 & ...

  9. 我们是怎么实现Grpc CodeFirst

    前言: Grpc默认是ProtoFirst的,即先写 proto文件,再生成代码,需要人工维护proto,生成的代码也不友好,所以出现了Grpc CodeFirst,下面来说说我们是怎么实现Grpc ...

  10. python3 open txt的UnicodeDecodeError: 'gbk' codec问题解决方案

    python3 open txt的UnicodeDecodeError: 'gbk' codec问题解决方案先直截了当给出解决方案,在程序开头加上:import _locale_locale._get ...