XPath

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

  • 官方文档:http://www.w3school.com.cn/xpath/index.asp

  • XPath开发工具

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

    • nodename:选取此节点的所有子节点
    • /:从根节点开始选
    • //:选取原物,而不考虑元素的具体位置
    • .:当前节点
    • ..:父节点
    • @:选取属性
    • 案例
      • bookstore:选取bookstore下的所有子节点
      • /bookstore:选取根元素
      • bookstore/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[@lprice<90]/title
  • 通配符

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

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

lxml库

  • python的HTML/XML的解析器
  • 官方文档:https://lxml.de/index.html
  • 功能:
    • 解析HTML,案例v29
    • 文件读取,案例v30,v31
    • etree和XPath的配合使用,案例v32
from lxml import etree

html = etree.parse("./v31.html")
print(type(html))

rst = html.xpath('//book')
print(type(rst))
print(rst)

rst = html.xpath("//book[@category='sports']")
print(type(rst))
print(rst)

rst = html.xpath("//book[@category='sports']/year")
rst = rst[0]
print(type(rst))
print(rst.tag)
print(rst.text)

CSS选择器 BeautifulSoup4

  • 现在使用BeautifulSoup4

  • http://beautifulsoup.readthedocs.io/zh_CN/v4.4.0/

  • 几个常用的提取信息工具比较

    • 正则:很快,不好用,不许安装
    • beautifulsoup:慢,使用简单,安装简单
    • lxml:比较快,使用简单,安装一般
  • 案例 v33

  • 四大对象

    • Tag
      • 对应Html中的标签
      • 可以通过soup.tag_name
      • tag两个重要属性
        • name
        • attrs
      • a34
    • NavigableString
      • 对应内容值
    • BeautifulSoup
      • 表示的是一个文档的内容,大部分可以把他当做tag对象
    • Comment
      • 特殊类型的NavigableString对象
      • 对其输出,则内容不包括注释符号
  • 遍历文档对象

    • contents:tag的子节点以列表的方式给出
    • children:子节点以迭代器形式返回
    • descendants:所有孙节点
    • string
  • 搜索文档对象

    • find_all(name, attrs, recursive, text, **kwargs)
      • name:按照那个字符串搜索,可以传入的内容为
        • 字符串
        • 正则
        • 列表
      • kewwortd参数,可以用来表示属性
      • text:对应tag的文本值
  • css选择器

    • 使用soup.select,返回一个列表
    • 通过标签名称:soup.select('titile')
    • 通过雷鸣:soup.select(".content")
    • id查找:soup.select("#name_id")
    • 组合查找:soup.select("div #input_content")
    • 属性查找:soup.select("img[class='photo']")
    • 获取tag内容:tag.get_text
# coding=utf-8

from urllib import request
from bs4 import BeautifulSoup


url = "http://www.baidu.com"

rsp = request.urlopen(url)
content = rsp.read()
soup = BeautifulSoup(content, 'lxml')

titles = soup.select('title')
print(titles)

metas = soup.select("meta[content='always']")
print(metas)
posted @ 2019-05-28 16:33  Rener  阅读(174)  评论(0编辑  收藏  举报