使用lxml的xpath读取网页中的表格并转化为pandas的DataFrame

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        @                          选取属性。
  • 1
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值