使用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>nodenametd>

<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,python,xml,xpath,html)