使用BeautifulSoup和lxml,可以解析代码并不规范的网页,并补充代码方便解析。使用过BeatuifulSoup解析网页,解析速度上并没有lxml快,本人爬取过一个网站,用aiohttp+BeautifulSoup,协程一起爬20多个网页,由于解析超时会中断,改用lxml后,就没有出现这个问题,爬取速度提升了数倍。
使用lxml步骤:
1,引入包:from lxml import etree
2,解析获得的网页:html = etree.HTML(要解析的网页或文本)
3,使用etree匹配获得要取得的内容:
例如:获得 html中所有的li内容:
li = html.xpath('//li')
下面是一份完整代码:
假设html内容如下:
<html>
<head></head>
<title>***</title>
<body>
...
<li class="name" id = "hahaha"> 哈哈哈<a href="'www.bai.com" id="a" ></a></li>
<li class="haha"></li>
...
</body>
</html>
python代码:
from lxml import etree
html = etree.HTML(html)
li = html.xpath('//li/@class') #代表从根目录寻找所有li的class属性,输出 ['name','haha']
print(html.xpath('//li[contains(@class,"name")]/text()') ) #从根目录寻找class为name的li下的文本,输出为哈哈哈
print(li.xpath('./a/@href')) #从li节点开始寻找所有的a节点的href,输出为www.bai.com
print(li[0].attrib) #输出li[0]的属性,输出为{"class":"name","id":"haha"}
pirnt(li.text) #哈哈哈
常用的符号如下,跟shell寻找目录路径规则相似:
表达式 | 描述 |
nodename | 选取此节点的所有子节点 |
/ | 下一节点 |
// | 从当前节点开始递归下降,此路径运算符出现在模式开头时,表示应从根节点递归下降。 |
. | 选取当前节点 |
.. | 选取当前节点的父节点 |
@ | 选取属性 |
@* | 选取所有属性 |
[] | 应用筛选模式,可以用来筛选想要的内容 |