Python爬虫中XML、XPath、lxml的使用

XML

  • XML(EXtensibleMarkupLanguage)
  • http://www.w3school.com.cn/xml/index.asp
<?xml version="1.0" encoding="utf-8"?>

<bookstore>
    <book category="cooking">
        <title lang="en">Everyday Italian</title>
        <author>Gidada De</author>
        <year>2018</year>
        <price>23</price>
    </book>
    
    <book category="education">
        <title lang="en">Python is Python</title>
        <author>Food War</author>
        <year>2008</year>
        <price>83</price>
    </book>

    <book category="sport">
        <title lang="en">Running</title>
        <author>Klaus Kuka</author>
        <year>2010</year>
        <price>43</price>
    </book>

</bookstore>
  • 概念:父节点,子节点,先辈节点,兄弟节点,后代节点

XPath

  • XPath(XML Path Language), 是一门在XML文档中查找信息的语言,

  • 官方文档: 官方文档

  • XPath开发工具

    • 开元的XPath表达式工具: XMLQuire
    • chrome插件: Xpath Helper
    • Firefox插件: XPath CHecker
  • 常用路径表达式:

    • nodename: 选取此节点的所有子节点
    • /: 从根节点开始选
    • //: 选取元素,而不考虑元素的具体为止
    • .: 当前节点
    • …:父节点
    • @: 选取属性
      • booksotre: 选取bookstore下的所有子节点
      • /booksotre: 选取根元素
      • booksotre/book: 选取bookstore的所有为book的子元素
      • //book: 选取book子元素
      • //@lang:选取名称为lang的所有属性
  • 谓语(Predicates)

    • 谓语用来查找某个特定的节点,被向前在方括号中
    • /bookstore/book[1]: 选取第一个属于bookstore下叫book的元素
    • /bookstore/book[last()]: 选取最后一个属于bookstore下叫book的元素
    • /bookstore/book[last()-1]: 选取倒数第二个属于bookstore下叫book的元素
    • /bookstore/book[position()❤️]: 选取属于bookstore下叫book的前两个元素
    • /bookstore/book[@lang]: 选取属于bookstore下叫book的,含有属性lang元素
    • /bookstore/book[@lang=“cn”]: 选取属于bookstore下叫book的,含有属性lang的值是cn的元素
    • /bookstore/book[@price < 90]: 选取属于bookstore下叫book的,含有属性price的,且值小于90的元素
    • /bookstore/book[@price < 90]/title: 选取属于bookstore下叫book的,含有属性price的,且值小于90的元素的子元素title
  • 通配符

    • * : 任何元素节点
    • @*: 匹配任何属性节点
    • node(): 陪陪任何类型的节点
  • 选取多个路径

    • //book/tile | //book/author : 选取book元素中的title和author元素
    • //tile | //price: 选取文档中所有的title和price元素

lxml库

  • python的HTML/XML的解析器
  • 官方文档: 官方文档
  • 需要安装:conda install lxml
  • 功能:
    • 解析HTML
# v30.html
'''
安装lxml
'''
from lxml import etree

'''
用lxml来解析HTML代码
'''

text = '''
<div>
    <ul>
        <li class="item-0"> <a href="0.html"> first item </a></li>
        <li class="item-1"> <a href="1.html"> first item </a></li>
        <li class="item-2"> <a href="2.html"> first item </a></li>
        <li class="item-3"> <a href="3.html"> first item </a></li>
        <li class="item-4"> <a href="4.html"> first item </a></li>
        <li class="item-5"> <a href="5.html"> first item </a>
    </ul>
</div>
'''

# 利用etree.HTML把字符串解析成HTML文档
html = etree.HTML(text)
s = etree.tostring(html)
print(s)

  • 文件读取
from lxml import etree

# 只能读取xml格式内容,html报错
html = etree.parse("./v30.html")

rst = etree.tostring(html, pretty_print=True)
print(rst)

  • etree和XPath的配合使用
from lxml import etree

# 只能读取xml格式内容,html报错
html = etree.parse("./v30.html")
print(type(html))

# 查找所有book元素
rst = html.xpath('//book')
print(type(rst))
print(rst)

# xpath的意识是,查找带有category属性值为sport的book元素
rst = html.xpath('//book[@category="sport"]')
print(type(rst))
print(rst)

# xpath的意识是,查找带有category属性值为sport的book元素下的year元素
rst = html.xpath('//book[@category="sport"]/year')
rst = rst[0]
print(type(rst))
print(rst.tag)
print(rst.text)

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值