lxml+xpath历遍HTML表格数据

HTML源码

<table id="table1" cellspacing="0px">
  <tr>
    <th>编号</th>
    <th>姓名</th>
    <th>年龄</th>
  </tr>
  <tr>
    <td>1</td>
    <td>张三</td>
    <td>11</td>
  </tr>
  <tr>
    <td>2/td>
    <td>李四</td>
    <td>12</td>
  </tr>
  <tr>
    <td>3</td>
    <td>王五</td>
    <td>13</td>
  </tr>
  <tr>
    <td>4</td>
    <td>马六</td>
    <td>14</td>
  </tr>
</table>

Python代码

from lxml import etree

content = etree.HTML(html)
rows = content.xpath('//table[@id="juniorchina_table"]/tr')[1:]
for row in rows:
    id = row.xpath('./td[1]/text()')[0]
    name = row.xpath('./td[2]/text()')[0]
    age = row.xpath('./td[3]/text()')[0]
    print(id, name, age)
### Python中使用lxml库的etree模块进行XPath操作 #### 创建XML或HTML文档对象 为了执行XPath查询,首先需要创建一个`etree.ElementTree`实例。这可以通过解析字符串或者读取文件来完成。 对于HTML内容,可以利用`etree.HTML()`方法将字符串形式的HTML片段转换成可被解析的对象[^5]: ```python from lxml import etree html_content = "<html><body><p>Hello world</p></body></html>" html_doc = etree.HTML(html_content) ``` 而对于标准的XML,则应该采用`etree.XML()`函数[^1]: ```python xml_content = """<library> <book id="b1">Book One</book> <book id="b2">Book Two</book> </library>""" xml_doc = etree.XML(xml_content.encode('utf-8')) ``` #### 执行基本的XPath查询 一旦拥有了文档对象,就可以调用其`.xpath()`方法并传入相应的XPath表达式来进行数据提取了。比如要找到所有的`book`标签节点: ```python books = xml_doc.xpath('//book') for book in books: print(book.text.strip()) ``` 此段代码会所有匹配到的元素,并打印它们内部的文字内容。 当涉及到更复杂的结构时,还可以通过指定路径中的具体位置或其他条件进一步细化搜索范围。例如获取表格内第二行的数据[^4]: ```python second_row_data = html_doc.xpath('//table/tr[2]/td/text()') print(second_row_data) ``` #### 处理带命名空间的XML文档 如果遇到含有命名空间定义的XML文档,在构建XPath语句的时候就需要特别注意。此时应当先声明好对应的映射关系,再将其作为参数传递给`.xpath()`方法[^3]。 ```python namespaces = {'ns': 'http://example.org/ns'} elements_with_ns = xml_doc.xpath('//ns:element', namespaces=namespaces) ``` 这样就能正确识别那些属于特定命名空间下的元素了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JOSON.

你的鼓励是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值