使用lxml的xpath读取网页中的表格并转化为pandas的DataFrame
2016-07-09 19:26
686 查看
lxml是Python的一个用来读写HTML和XML格式数据的库,她可以高效而且可靠地解析大文件。lxml有一个编程接口lxml.html可以用来处理HTML。
lxml库内置了对xpath的支持,所以可以很方便地使用xpath来获取html文件中的各个标签的内容。
XPath 是一门在 XML 文档中查找信息的语言。XPath 可用来在 XML 文档中对元素和属性进行遍历。
XPath 是 W3C XSLT 标准的主要元素,并且 XQuery 和 XPointer 都构建于 XPath 表达之上。
因此,对 XPath 的理解是很多高级 XML 应用的基础。
xpath的语法非常简单,可以从w3school学习一下语法,十几分钟就足够了。
好了,开始干活。我们获取这个页面的第一个表格。
我们查看一下网页的源代码,找到需要获取的表格
表格的第一行为标题,下面的各行为数据,我们定义一个函数来分别得到它们:
下面来整合数据并转化为DataFrame类型,pandas提供了一个可以自动类型转换的TextParse类,可以将文本类型自动转换为我们需要的类型。
来测试一下:
lxml库内置了对xpath的支持,所以可以很方便地使用xpath来获取html文件中的各个标签的内容。
XPath 是一门在 XML 文档中查找信息的语言。XPath 可用来在 XML 文档中对元素和属性进行遍历。
XPath 是 W3C XSLT 标准的主要元素,并且 XQuery 和 XPointer 都构建于 XPath 表达之上。
因此,对 XPath 的理解是很多高级 XML 应用的基础。
xpath的语法非常简单,可以从w3school学习一下语法,十几分钟就足够了。
好了,开始干活。我们获取这个页面的第一个表格。
from lxml.html import parse from urllib.request import urlopen # 使用的是Python3, Python2可能需要from urllib2 import urlopen doc = parse(urlopen('http://www.w3school.com.cn/xpath/xpath_syntax.asp')) # 打开url, 并且使用parse方法转化为可以使用xpath查找的格式 tables = doc.xpath('//table') # 查找文档中所有的table, 返回一个列表
我们查看一下网页的源代码,找到需要获取的表格
<table class="dataintable"> <tr> <th style="width:25%;">表达式</th> <th>描述</th> </tr> <tr> <td>nodename</td> <td>选取此节点的所有子节点。</td> </tr> <tr> <td>/</td> <td>从根节点选取。</td> </tr> <tr> <td>//</td> <td>从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。</td> </tr> <tr> <td>.</td> <td>选取当前节点。</td> </tr> <tr> <td>..</td> <td>选取当前节点的父节点。</td> </tr> <tr> <td>@</td> <td>选取属性。</td> </tr> </table>
表格的第一行为标题,下面的各行为数据,我们定义一个函数来分别得到它们:
def _unpack(row, kind='td'): elts = row.xpath('.//%s' %kind) # 根据标签的类型获取数据 return [val.text_content() for val in elts] # 使用列表推导式返回一个列表
下面来整合数据并转化为DataFrame类型,pandas提供了一个可以自动类型转换的TextParse类,可以将文本类型自动转换为我们需要的类型。
from pandas.io.parsers import TextParser def parse_options_data(table): rows = table.xpath('.//tr') # 以table为当前路径,查找tr标签 header = _unpack(rows[0], kind='th') # 查找th标签作为header data = [_unpack(r) for r in rows[1:]] # 剩下的行作为data return TextParser(data, names=header).get_chunk() # 返回一个DataFrame
来测试一下:
content = parse_options_data(tables[0])
nodename 选取此节点的所有子节点。 0 / 从根节点选取。 1 // 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。 2 . 选取当前节点。 3 .. 选取当前节点的父节点。 4 @ 选取属性。
相关文章推荐
- Python动态类型的学习---引用的理解
- Python3写爬虫(四)多线程实现数据爬取
- 垃圾邮件过滤器 python简单实现
- 下载并遍历 names.txt 文件,输出长度最长的回文人名。
- install and upgrade scrapy
- Scrapy的架构介绍
- Centos6 编译安装Python
- 使用Python生成Excel格式的图片
- 让Python文件也可以当bat文件运行
- [Python]推算数独
- Python中zip()函数用法举例
- Python中map()函数浅析
- Python将excel导入到mysql中
- 在Windows 8.1的IE 11中屏蔽双击放大功能
- Python在CAM软件Genesis2000中的应用