
看地方吧
pyquery库是jQuery的Python实现,可以用于解析HTML网页内容,我个人写过的一些抓取网页数据的脚本就是用它来解析html获取数据的。今天重新看了一遍整个文档,把它的一些使用方法整理了一下,做个记录。
使用方法
from pyquery import PyQuery as pq
1可加载一段HTML字符串,或一个HTML文件,或是一个url地址,
例:
d=pq("<html><title>hello</title></html>")
d=pq(filename=path_to_html_file)
d=pq(url='')注意:此处url似乎必须写全
2html()和text() ——获取相应的HTML块或文本块,
例:
p=pq("<head><title>hello</title></head>")
p('head')html()#返回<title>hello</title>
p('head')text()#返回hello
3根据HTML标签来获取元素,
例:
d=pq('<div><p>test 1</p><p>test 2</p></div>')
d('p')#返回[<p>,<p>]
print d('p')#返回<p>test 1</p><p>test 2</p>
print d('p')html()#返回test 1
注意:当获取到的元素不只一个时,html()、text()方法只返回首个元素的相应内容块
4eq(index) ——根据给定的索引号得到指定元素
接上例,若想得到第二个p标签内的内容,则可以:
print d('p')eq(1)html() #返回test 2
5filter() ——根据类名、id名得到指定元素,例:
d=pq("<div><p id='1'>test 1</p><p class='2'>test 2</p></div>")
d('p')filter('#1') #返回[<p#1>]
d('p')filter('2') #返回[<p2>]
6find() ——查找嵌套元素,例:
d=pq("<div><p id='1'>test 1</p><p class='2'>test 2</p></div>")
d('div')find('p')#返回[<p#1>, <p2>]
d('div')find('p')eq(0)#返回[<p#1>]
7直接根据类名、id名获取元素,例:
d=pq("<div><p id='1'>test 1</p><p class='2'>test 2</p></div>")
d('#1')html()#返回test 1
d('2')html()#返回test 2
8获取属性值,例:
d=pq("<p id='my_id'><a href=''>hello</a></p>")
d('a')attr('href')#返回
d('p')attr('id')#返回my_id
9修改属性值,例:
d('a')attr('href', '')把href属性修改为了baidu
10addClass(value) ——为元素添加类,例:
d=pq('<div></div>')
daddClass('my_class')#返回[<divmy_class>]
11hasClass(name) #返回判断元素是否包含给定的类,例:
d=pq("<div class='my_class'></div>")
dhasClass('my_class')#返回True
12children(selector=None) ——获取子元素,例:
d=pq("<span><p id='1'>hello</p><p id='2'>world</p></span>")
dchildren()#返回[<p#1>, <p#2>]
dchildren('#2')#返回[<p#2>]
13parents(selector=None)——获取父元素,例:
d=pq("<span><p id='1'>hello</p><p id='2'>world</p></span>")
d('p')parents()#返回[<span>]
d('#1')parents('span')#返回[<span>]
d('#1')parents('p')#返回[]
14clone() ——返回一个节点的拷贝
15empty() ——移除节点内容
16nextAll(selector=None) ——返回后面全部的元素块,例:
d=pq("<p id='1'>hello</p><p id='2'>world</p><img scr='' />")
d('p:first')nextAll()#返回[<p#2>, <img>]
d('p:last')nextAll()#返回[<img>]
17not_(selector) ——返回不匹配选择器的元素,例:
d=pq("<p id='1'>test 1</p><p id='2'>test 2</p>")
d('p')not_('#2')#返回[<p#1>]
pyquery还有其他一些用法,这里没有一一整理出来,更多更全的方法可以直接去看它的文档。
Python下的爬虫库,一般分为3类。
抓取类
urllib(Python3),这是Python自带的库,可以模拟浏览器的请求,获得Response用来解析,其中提供了丰富的请求手段,支持Cookies、Headers等各类参数,众多爬虫库基本上都是基于它构建的。建议学习了解一下,因为有些罕见的问题需要通过底层的方式解决。
requests,基于urllib,但是更方便易用。强烈推荐掌握。
解析类
re:正则表达式官方库,不仅仅是学习爬虫要使用,在其他字符串处理或者自然语言处理的过程中,这是绕不过去的一个库,强烈推荐掌握。
BeautifulSoup:方便易用,好上手,推荐掌握。通过选择器的方式选取页面元素,并获取对应的内容。
lxml:使用
lxmletree
将字符串转换之后,我们可以使用XPath表达式来解析网页,终极推荐。XPath对于网页解析的支持非常强大,而且很容易上手。它本来是设计出来进行XML元素选择的,但是它同样支持HTML。pyquery:另一个强大的解析库,感兴趣的可以学习下。
综合类
selenium:所见即所得式爬虫,综合了抓取和解析两种功能,一站式解决。很多动态网页不太容易通过requests、scrapy直接抓取,比如有些url后边带了加密的随机数,这些算法不太好破解,这种情况下,只能通过直接访问网址、模拟登陆等方式请求到页面源码,直接从网页元素中解析内容,这种情况下,Selenium就是最好的选择。不过Selenium最初设计出来,是用于测试的。强烈推荐。
scrapy:另一个爬虫神器,适合爬取大量页面,甚至对分布式爬虫提供了良好的支持。强烈推荐。
以上这些是我个人经常使用的库,但是还有很多其他的工具值得学习。比如Splash也支持动态网页的抓取;Appium可以帮助我们抓取App的内容;Charles可以帮助我们抓包,不管是移动端还是PC网页端,都有良好的支持;pyspider也是一个综合性的框架;MySQL(pymysql)、MongoDB(pymongo),抓到了数据就要存储,数据库也是绕不过去的。
掌握了以上这些,基本上大部分的爬虫任务都难不倒你啦!
Python 中可以进行网页解析的库有很多,常见的有 BeautifulSoup 和 lxml 等。在网上玩爬虫的文章通常都是介绍 BeautifulSoup 这个库,我平常也是常用这个库,最近用 Xpath 用得比较多,使用 BeautifulSoup 就不大习惯,很久之前就知道 Reitz 大神出了一个叫 Requests-HTML 的库,一直没有兴趣看,这回可算歹着机会用一下了。
使用 pip install requests-html 安装,上手和 Reitz 的其他库一样,轻松简单:
这个库是在 requests 库上实现的,r 得到的结果是 Response 对象下面的一个子类,多个一个 html 的属性。所以 requests 库的响应对象可以进行什么 *** 作,这个 r 也都可以。如果需要解析网页,直接获取响应对象的 html 属性:
不得不膜拜 Reitz 大神太会组装技术了。实际上 HTMLSession 是继承自 requestsSession 这个核心类,然后将 requestsSession 类里的 requests 方法改写,返回自己的一个 HTMLResponse 对象,这个类又是继承自 requestsResponse,只是多加了一个 _from_response 的方法来构造实例:
之后在 HTMLResponse 里定义属性方法 html,就可以通过 html 属性访问了,实现也就是组装 PyQuery 来干。核心的解析类也大多是使用 PyQuery 和 lxml 来做解析,简化了名称,挺讨巧的。
元素定位可以选择两种方式:
方法名非常简单,符合 Python 优雅的风格,这里不妨对这两种方式简单的说明:
定位到元素以后势必要获取元素里面的内容和属性相关数据,获取文本:
获取元素的属性:
还可以通过模式来匹配对应的内容:
这个功能看起来比较鸡肋,可以深入研究优化一下,说不定能在 github 上混个提交。
除了一些基础 *** 作,这个库还提供了一些人性化的 *** 作。比如一键获取网页的所有超链接,这对于整站爬虫应该是个福音,URL 管理比较方便:
内容页面通常都是分页的,一次抓取不了太多,这个库可以获取分页信息:
结果如下:
通过迭代器实现了智能发现分页,这个迭代器里面会用一个叫 _next 的方法,贴一段源码感受下:
通过查找 a 标签里面是否含有指定的文本来判断是不是有下一页,通常我们的下一页都会通过 下一页 或者 加载更多 来引导,他就是利用这个标志来进行判断。默认的以列表形式存在全局: ['next','more','older'] 。我个人认为这种方式非常不灵活,几乎没有扩展性。 感兴趣的可以往 github 上提交代码优化。
也许是考虑到了现在 js 的一些异步加载,这个库支持 js 运行时,官方说明如下:
使用非常简单,直接调用以下方法:
第一次使用的时候会下载 Chromium,不过国内你懂的,自己想办法去下吧,就不要等它自己下载了。render 函数可以使用 js 脚本来 *** 作页面,滚动 *** 作单独做了参数。这对于上拉加载等新式页面是非常友好的。
Golang如何解析Html代码
用Golang的朋友都知道如果我们要从HTML中提取一些内容、比如title或者是h2在或者是一些其他的HTML的内容、在Golang里面我们如果要自己写代码来提取还是相当的麻烦的;
由于我之前在写Pyhon的爬虫的时候也需要解析HTML标签;所以用过PyQuery和BS4这次在用Golang写爬虫的时候就留意了一下是否有Golang版本的Query。github是个好地方;上面很找到很多开源的代码可以用;包括GoQuery。
所以这次会介绍一下如何用GoQuery来解析HTML元素。
导入Goquery模块
package mainimport ( "fmt" "githubcom/opesun/goquery")其实还有一个githubcom/PuerkitoBio/goquery的goquery模块、但是配置环境经常出差就没有选择
Goquery的各种用法
goquery有Jquery的大部分特性;如果你熟悉Jquery的话用Goquery就很简单了
解析HTML的title
var url = ">
以上就是关于python pyquery不能有空格吗全部的内容,包括:python pyquery不能有空格吗、Python什么爬虫库好用、Python网页解析库:用requests-html爬取网页等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)