python_new
  • Introduction
  • First Chapter
  • 一、python基础
    • 1.1 常识
      • sys
    • 1.2 基础语法(1)
    • 1.2 基础语法(2)
    • 1.3 常见问题求解
    • 1.4 算法
  • 二、爬虫
    • urllib库(1)
      • urllib库(2)
    • requests模块(1)
      • requests模块(2)
    • 2.1 爬虫基础(3)HTTP原理
    • 2.1 爬虫基础(4)会话和Cookies
    • 2.1 爬虫基础(5)数据存储
      • Mysql存储
      • MongoDB存储
      • Redis存储
    • 2.3 正则表达式
    • 2.4 解析库lxml
      • BeautifulSoup
      • pyquery(1)
      • pyquery(2)
    • 2.5 selenium(1)
    • 2.5 seleium(2)
    • 2.6 Json
    • 2.7 scrapy
      • scrapy(2)
    • 2.9 异步加载
    • 2.6 Splash
  • ORM框架
    • SQLAlchemy
  • Django
    • 1、初阶(一)
    • 初学:投票教程(一)
    • 初学:投票教程(二)
    • 初学:投票教程(三)
    • 初学:投票教程(总结)
    • 模型(一)
    • 模型(二)
    • 视图(一)
    • 视图(二)
    • 模板(一)
    • django实际使用笔记
  • 面试题收集总结
    • 数据结构原理
    • 算法篇
      • 排序
    • 题目篇
  • python数据分析
    • 基础了解(一)
    • 基础了解(二)
    • 基础了解(三)
  • 多线程
  • 深度学习
    • 疑问
  • keras(一)
  • 神经网络
  • 图像识别
  • Docker
    • 一、基础了解
Powered by GitBook
On this page

Was this helpful?

  1. 二、爬虫

2.4 解析库lxml

lxml和BeautifulSoup是python中两个用来解析网页的库,前者功能强大,效率较高,后者使用方便简单,但效率低于前者。

一、lxml库

可以迅速灵活的处理XML,支持XPath(XML Path Language,是一门在 XML 文档中查找信息的语言),主要作用是用来快速定位特定元素和节点信息,提取出HTML、XML目标数据。

1.路径表达式

nodename  # 选取此节点的所有节点
/         # 从根节点选取
//        # 从匹配选择的当前节点选择文档中的节点,而不考虑他们的位置
.         # 选取当前节点
..        # 选取当前节点的父节点
@         # 选取属性

2.谓语

/bookstore/book[1]                  # 选取属于bookstore子元素的第一个book元素
/bookstore/book[last()]             # 选取属于bookstore子元素的最后一个book元素
/bookstore/book[last()-1]           # 选取属于bookstore子元素的倒数第二个book元素
/bookstore/book[position()<3]       # 选取属于bookstore子元素的最前面的两个book元素
//title[@lang]                      # 选取所有拥有lang属性的title元素
//title[@lang = 'eng']              # 选取所有拥有lang属性且等于'eng'的title元素
/bookstore/book[price>35.00]        # 选取bookstore中的book子元素,且其中的price的值必须大于35.00(price的值?)
/bookstore/book[price>35.00]/title  # 选取bookstore中的book子元素中的所有title元素,且其中的price元素的值须大于35.00

3.未知节点

*      # 匹配任何元素节点
@*     # 匹配任何属性节点
node() # 匹配任何类型的节点

#如下例

/bookstore/*   # 选取bookstore中的所有子元素
//*            # 选取文档中的所有元素
//title[@*]    # 选取所有电邮属性的title元素

4.多个路径

//bookstore/title | //book/price   # 选取book元素中的所有title和price元素
//title | //price                  # 选取文档中的所有title和prices元素
/bookstore/book/title | //price    # 选取bookstore的book元素中的所有title元素,以及文档中所有的price元素

5.使用

  • 从文本中解析HTML

from lxml import etree

text = '''
<div>
    <ul>
         <li class="item-0"><a href="link1.html">first item</a></li>
         <li class="item-1"><a href="link2.html">second item</a></li>
         <li class="item-inactive"><a href="link3.html">third item</a></li>
         <li class="item-1"><a href="link4.html">fourth item</a></li>
         <li class="item-0"><a href="link5.html">fifth item</a>
     </ul>
 </div>
'''
html = etree.HTML(text)
result = etree.tostring(html)
print(result) #需要decode?
  • 查找相应的信息

import urllib.request
from lxml import etree

url = 'http://www.baidu.com'
response = urllib.request.urlopen(url)
html = response.read().decode('utf-8')
page = etree.HTML(html)
linklist = page.xpath('//*[@rel="dns-prefetch"]/@href')
for i in linklist:
    print(i)

方法etree.HTML解析字符串后得到的是一个element对象,使用该对象的xpath方法和路径表达式可以很方便的得到目标信息。

6、方法

6.1 获取文本

/test()

from lxml import etree

html = etree.parse('./test.html', etree.HTMLParser())
result = html.xpath('//li[@class="item-0"]/text()')
print(result)

6.2 属性获取

/@属性

from lxml import etree

html = etree.parse('./test.html', etree.HTMLParser())
result = html.xpath('//li/a/@href')
print(result)

/[contains(@属性,'值' )] 当有多个属性值时

from lxml import etree
text = '''
<li class="li li-first"><a href="link.html">first item</a></li>
'''
html = etree.HTML(text)
result = html.xpath('//li[contains(@class, "li")]/a/text()')
print(result)

and 匹配多个属性

from lxml import etree
text = '''
<li class="li li-first" name="item"><a href="link.html">first item</a></li>
'''
html = etree.HTML(text)
result = html.xpath('//li[contains(@class, "li") and @name="item"]/a/text()')
print(result)

运算符

描述

实例

返回值

or

或

age=19orage=20

如果age是19,则返回true。如果age是21,则返回false

and

与

age>19andage<21

如果age是20,则返回true。如果age是18,则返回false

mod

计算除法的余数

5mod2

1

|

计算两个节点集

//book|//cd

返回所有拥有book和cd元素的节点集

+

加法

6+4

10

-

减法

6月4日

2

*

乘法

6*4

24

div

除法

8div4

2

=

等于

age=19

如果age是19,则返回true。如果age是20,则返回false

!=

不等于

age!=19

如果age是18,则返回true。如果age是19,则返回false

<

小于

age<19

如果age是18,则返回true。如果age是19,则返回false

<=

小于或等于

age<=19

如果age是19,则返回true。如果age是20,则返回false

>

大于

age>19

如果age是20,则返回true。如果age是19,则返回false

>=

大于或等于

age>=19

如果age是19,则返回true。如果age是18,则返回false

Previous2.3 正则表达式NextBeautifulSoup

Last updated 6 years ago

Was this helpful?