使用lxml解析网页

lxml的安装

使用pip安装

pip install lxml

关于lxml

lxml使用的是Xpath语法,而且使用的是C语言编写,比不使用lxml解析器的BeautifulSoup快一些。
Xpath是一门在XML文档中查找信息的语言。Xpath使用路径表达式来选取XML文档中的节点或节点集,也可以用在HTML获取数据中。

import requests
from lxml import etree

link = "http://www.santostang.com/"
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) \
           AppleWebKit/537.36 (KHTML, like Gecko) \
           Chrome/70.0.3538.25 \
           Safari/537.36 Core/1.70.3741.400 QQBrowser/10.5.3863.400 ',
          'Host': 'www.santostang.com'
          }
r = requests.get(link, headers=headers)

html = etree.HTML(r.text) #解析为lxml格式
title_list = html.xpath('//h1[@class="post-title"]/a/text()')
print(title_list)

和BeautifulSoup类似,使用lxml的时候需要先用html=etree.HTML(r.text)解析为lxml格式,然后用Xpath读取里面的内容。
其中,"//h1"表示选取所有<h1>子元素,"//"无论文档在什么位置,后面加上[@class="post-title"]表示选取<h1>中class为"post-title"的元素,/a表示选取<h1>子元素的<a>元素,text()表示提取<a>元素中的所有文本。

我们可以使用浏览器的“检查”方法快速获得一个元素的Xpath:

选中一个元素——>右键——>Copy——>Copy Xpath


表达式
描述
nodename
选取此节点的所有子节点。
/
从根节点选取。
//
从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。
.
选取当前节点。
..
选取当前节点的父节点。
@
选取属性。

下面是一个XML文档:

<bookstore>
<book>
	<title>HarryPotter</title>
	<author>JK.Rowling</author>
	<year>2005</year>
	<price>29.99</price>
</book>
</bookstore>
在下面的表格中,我们已列出了一些路径表达式以及表达式的结果:
路径表达式
结果
bookstore
选取 bookstore 元素的所有子节点。
/bookstore
选取根元素 bookstore。
注释:假如路径起始于正斜杠( / ),则此路径始终代表到某元素的绝对路径!
bookstore/book
选取属于 bookstore 的子元素的所有 book 元素。
//book
选取所有 book 子元素,而不管它们在文档中的位置。
bookstore//book
选择属于 bookstore 元素的后代的所有 book 元素,而不管它们位于 bookstore 之下的什么位置。
//@lang
选取名为 lang 的所有属性。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章