您的位置:首页 > 编程语言 > Python开发

使用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学习一下语法,十几分钟就足够了。

好了,开始干活。我们获取这个页面的第一个表格。

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 xml xpath html