Python爬虫基础之lxml

一、Python lxml的基本应用

 1 <html>
 2  <head>
 3   <title>
 4    The Dormouse‘s story
 5   </title>
 6  </head>
 7  <body>
 8   <p class="title">
 9    <b>
10     The Dormouse‘s story
11    </b>
12   </p>
13   <p class="story">
14    Once upon a time there were three little sisters; and their names were
15    <a class="sister" href="http://example.com/elsie" id="link1">
16     Elsie
17    </a>
18    ,
19    <a class="sister" href="http://example.com/lacie" id="link2">
20     Lacie
21    </a>
22    and
23    <a class="sister" href="http://example.com/tillie" id="link3">
24     Tillie
25    </a>
26    ; and they lived at the bottom of a well.
27   </p>
28   <p class="story">
29    ...
30   </p>
31  </body>
32 </html>

1.使用lxml.etree和lxml.cssselect解析html源码

 1 from lxml import etree, cssselect
 2 from cssselect import GenericTranslator, SelectorError
 3
 4 parser = etree.HTMLParser(remove_blank_text=True)
 5 document = etree.fromstring(html_doc, parser)
 6
 7 # 使用CSS选择器
 8 sel = cssselect.CSSSelector(‘p a‘)
 9 results_sel_href = [e.get(‘href‘) for e in sel(document)]  # 打印a标签的href属性
10 results_sel_text = [e.text for e in sel(document)]  # 打印<a></a>之间的文本
11 print(results_sel_href)
12 print(results_sel_text)
13
14 # 使用CSS样式
15 results_css = [e.get(‘href‘) for e in document.cssselect(‘p a‘)]
16 print(results_css)
17
18
19 # 使用xpath
20 try:
21     expression = GenericTranslator().css_to_xpath(‘p a‘)
22     print(expression)
23 except SelectorError:
24     print(‘Invalid selector.‘)
25
26 results_xpath = [e.get(‘href‘) for e in document.xpath(expression)]  # document.xpath(‘//a‘)
27 print(results_xpath)

2.cleaning up html

使用html清理器,可以移除一些嵌入的脚本、标签、CSS样式等html元素,这样可以提高搜索效率。

 1 # cleaning up html
 2 # 1.不使用Cleaner
 3 from lxml.html.clean import Cleaner
 4 html_after_clean = clean_html(html_doc)
 5 print(html_after_clean)
 6 # <div>
 7 #    The Dormouse‘s story
 8 #  <body>
 9 #   <p class="title">
10 #    <b>
11 #     The Dormouse‘s story
12 #    </b>
13 #   </p>
14 #   <p class="story">
15 #    Once upon a time there were three little sisters; and their names were
16 #    <a class="sister" href="http://example.com/elsie" id="link1">
17 #     Elsie
18 #    </a>
19 #    ,
20 #    <a class="sister" href="http://example.com/lacie" id="link2">
21 #     Lacie
22 #    </a>
23 #    and
24 #    <a class="sister" href="http://example.com/tillie" id="link3">
25 #     Tillie
26 #    </a>
27 #    ; and they lived at the bottom of a well.
28 #   </p>
29 #   <p class="story">
30 #    ...
31 #   </p>
32 #  </body>
33 # </div>
34
35 # 2.使用Cleaner
36 cleaner = Cleaner(style=True, links=True, add_nofollow=True, page_structure=False, safe_attrs_only=False)
37 html_with_cleaner = cleaner.clean_html(html_doc)
38 print(html_with_cleaner)
39 # <html>
40 #  <head>
41 #   <title>
42 #    The Dormouse‘s story
43 #   </title>
44 #  </head>
45 #  <body>
46 #   <p class="title">
47 #    <b>
48 #     The Dormouse‘s story
49 #    </b>
50 #   </p>
51 #   <p class="story">
52 #    Once upon a time there were three little sisters; and their names were
53 #    <a class="sister" href="http://example.com/elsie" id="link1">
54 #     Elsie
55 #    </a>
56 #    ,
57 #    <a class="sister" href="http://example.com/lacie" id="link2">
58 #     Lacie
59 #    </a>
60 #    and
61 #    <a class="sister" href="http://example.com/tillie" id="link3">
62 #     Tillie
63 #    </a>
64 #    ; and they lived at the bottom of a well.
65 #   </p>
66 #   <p class="story">
67 #    ...
68 #   </p>
69 #  </body>
70 # </html>

二、Python lxml的实际应用

1.解析网易云音乐html源码

这是网易云音乐华语歌曲的分类链接http://music.163.com/#/discover/playlist/?order=hot&cat=华语&limit=35&offset=0,打开Chrome F12的Elements查看到页面源码,我们发现每页的歌单都在一个iframe浮窗上面,每首单曲的信息构成一个li标签,包含歌单图片、

歌单链接、歌单名称等。

 1 <ul class="m-cvrlst f-cb" id="m-pl-container">
 2    <li>
 3     <div class="u-cover u-cover-1">
 4      <img class="j-flag" src="http://p1.music.126.net/FGe-rVrHlBTbnOvhMR99PQ==/109951162989189558.jpg?param=140y140" />
 5      <a title="【说唱】留住你一面,画在我心间" href="/playlist?id=832790627" class="msk"></a>
 6      <div class="bottom">
 7       <a class="icon-play f-fr" title="播放" href="javascript:;" data-res-type="13" data-res-id="832790627" data-res-action="play"></a>
 8       <span class="icon-headset"></span>
 9       <span class="nb">1615</span>
10      </div>
11     </div> <p class="dec"> <a title="【说唱】留住你一面,画在我心间" href="/playlist?id=832790627" class="tit f-thide s-fc0">【说唱】留住你一面,画在我心间</a> </p> <p><span class="s-fc4">by</span> <a title="JediMindTricks" href="/user/home?id=17647877" class="nm nm-icn f-thide s-fc3">JediMindTricks</a> <sup class="u-icn u-icn-84 "></sup> </p> </li>
12    <li>
13     <div class="u-cover u-cover-1">
14      <img class="j-flag" src="http://p1.music.126.net/If644P7ZrfPm_qcvtYyfzg==/18936888765458653.jpg?param=140y140" />
15      <a title="鞋子好看|国产自赏摇滚噪音流行" href="/playlist?id=721462105" class="msk"></a>
16      <div class="bottom">
17       <a class="icon-play f-fr" title="播放" href="javascript:;" data-res-type="13" data-res-id="721462105" data-res-action="play"></a>
18       <span class="icon-headset"></span>
19       <span class="nb">77652</span>
20      </div>
21     </div> <p class="dec"> <a title="鞋子好看|国产自赏摇滚噪音流行" href="/playlist?id=721462105" class="tit f-thide s-fc0">鞋子好看|国产自赏摇滚噪音流行</a> </p> <p><span class="s-fc4">by</span> <a title="原创君" href="/user/home?id=201586" class="nm nm-icn f-thide s-fc3">原创君</a> <sup class="u-icn u-icn-1 "></sup> </p> </li>
22   </ul>

开始解析html源码

首先实例化一个etree.HTMLParser对象,对html源码简单做下处理,创建cssselect.CSSSelector CSS选择器对象,搜索出无序列表ul下的所有li元素(_Element元素对象),再通过sel(document)遍历所有的_Element对象,使用find方法

find(self, path, namespaces=None) Finds the first matching subelement, by tag name or path. (lxml.ettr/lxml.cssselect 详细API请转义官网http://lxml.de/api/index.html)

通过xpath找到li的子元素img和a,通过_Element的属性attrib获取到属性字典,成功获取到歌单的图片链接,歌单列表链接和歌单名称。

 1 from lxml import etree, cssselect
 2
 3 html = ‘‘‘上面提取的html源码‘‘‘
 4 parser = etree.HTMLParser(remove_blank_text=True)
 5 document = etree.fromstring(html_doc, parser)
 6
 7 sel = cssselect.CSSSelector(‘#m-pl-container > li‘)
 8 for e in sel(document):
 9     img = e.find(‘.//div/img‘)
10     img_url = img.attrib[‘src‘]
11     a_msk = e.find(".//div/a[@class=‘msk‘]")
12     musicList_url = ‘http:/%s‘ % a_msk.attrib[‘href‘]
13     musicList_name = a_msk.attrib[‘title‘]
14     print(img_url,musicList_url,musicList_name)
时间: 2024-10-06 22:32:43

Python爬虫基础之lxml的相关文章

python爬虫-基础入门-爬取整个网站《3》

python爬虫-基础入门-爬取整个网站<3> 描述: 前两章粗略的讲述了python2.python3爬取整个网站,这章节简单的记录一下python2.python3的区别 python2.x 使用类库: >> urllib 库 >> urllib2 库 python3.x 使用的类库: >> urllib 库 变化: -> 在python2.x中使用import urllib2 ----- 对应的,在python3.x 中会使用import url

Python 爬虫基础

下面是一个 Python 爬虫最简单的例子,使用网络库 urllib2 和正则表达式库 re,模拟浏览器的 User-Agent. #!/usr/bin/env python # -*- coding: utf-8 -*- #引入基础网络库 import urllib2 #引入正则表达式模块 import re #模拟User-Agent headers = {'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWe

Python爬虫基础之requests

一.随时随地爬取一个网页下来 怎么爬取网页?对网站开发了解的都知道,浏览器访问Url向服务器发送请求,服务器响应浏览器请求并返回一堆HTML信息,其中包括html标签,css样式,js脚本等.我们之前用的是Python标准基础库Urllib实现的, 现在我们使用Python的Requests HTTP库写个脚本开始爬取网页.Requests的口号很响亮“让HTTP服务人类“,够霸气. 二.Python Requests库的基本使用 1.GET和POST请求方式 GET请求 1 import re

Python爬虫基础——XPath语法的学习与lxml模块的使用

XPath与正则都是用于数据的提取,二者的区别是: 正则:功能相对强大,写起来相对复杂: XPath:语法简单,可以满足绝大部分的需求: 所以,如果你可以根据自己的需要进行选择. 一.首先,我们需要为Google浏览器配置XPath插件: 请自行学习,效果如下: 二.XPath的语法: 注意: XPath的索引从1开始. 三.XPath的案例: 一级分类: //h3[@class="classify_c_h3"]/a/text() 二级分类: //div[@class="cl

Python爬虫基础知识入门一

一.什么是爬虫,爬虫能做什么 爬虫,即网络爬虫,大家可以理解为在网络上爬行的一直蜘蛛,互联网就比作一张大网,而爬虫便是在这张网上爬来爬去的蜘蛛咯,如果它遇到资源,那么它就会抓取下来.比如它在抓取一个网页,在这个网中他发现了一条道路,其实就是指向网页的超链接,那么它就可以爬到另一张网上来获取数据. 爬虫可以抓取的某个网站或者某个应用的内容,提取有用的价值.也可以模拟用户在浏览器或者App应用上的操作,实现自动化的程序.以下行为都可以用爬虫实现: 咨询报告(咨询服务行业) 抢票神器 投票神器 预测(

Python爬虫基础知识及前期准备

学习爬虫有一小段时间了,于是决定把自己学爬虫时所学的,写过的代码以及看过的文档记录下来,权当小结.第一次写这些,如果有错误,请多指教. 首先我们需要了解一下什么是爬虫. 根据百度百科上给出的定义," 网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本."简单来说,爬虫类似手动下载网页信息,比如小说.歌曲.说到这,或许会有疑问,既然这样,干嘛还去敲代码,直接人工处理不好吗?话是这么说,但如果下载的

Python爬虫基础与技巧

基于Python2.7 1 基本抓取网页 get 方法 import urllib2url = "http://www.baidu.com"response = urllib2.urlopen(url)print response.read() post 方法 import urllibimport urllib2 url = "http://abcde.com"form = {'name':'abc','password':'1234'}form_data = u

python爬虫基础02-urllib库

Python网络请求urllib和urllib3详解 urllib是Python中请求url连接的官方标准库,在Python2中主要为urllib和urllib2,在Python3中整合成了urllib. 官方文档链接为:https://docs.python.org/3/library/urllib.html 而urllib3则是增加了连接池等功能,两者互相都有补充的部分. urllib 它是 Python 内置的 HTTP 请求库,也就是说我们不需要额外安装即可使用,基本上涵盖了基础的网络请

python爬虫基础

#! usr/bin/env python# -*- coding: utf-8 -*- ''' post''' import urllibimport urllib2url = ''values = {'user' : 'v1', 'password' : 'v2'}data = urllib.urlencode(values) request = urllib2.Request(url, data)response = urllib2.urlopen(request)print respon