网页抓取手机号( CSS选择器库的基本属性和标签获取方式解析(一))
优采云 发布时间: 2022-03-03 19:18网页抓取手机号(
CSS选择器库的基本属性和标签获取方式解析(一))
pyquery 库
虽然 Beautiful Soup 库非常强大,但 CSS 选择器有些弱,至少对于 pyquery 库而言。
而且pyquery库不是Python的标准库,所以在使用pyquery库之前需要安装。示例命令如下:
pip install pyquery
安装完成后,我们就可以愉快的玩一下pyquery库了。需要注意的是,后面的所有解析代码都是基于下面的HTML代码(实战除外):
我是一个测试页面
Python板块<a>>1111</a>
基本用法
在pyquery库中,有一个PyQuery类,我们拿到的HTML或者XML代码,需要通过它的构造函数来创建它的对象实例。
示例代码(获取页面标题和所有标签的href属性值):
from pyquery import PyQuery as pq
with open('demo.html', 'r', encoding='utf-8') as f:
html = f.read()
doc = pq(html.strip())
print(doc('title').text())
for a in doc('a'):
print(a.get('href'), a.text)
运行后效果如下:
pyquery库通过get获取属性的值,使用text()方法获取标签的文本信息。但是我们这里直接加载的文档,其实pq()可以直接传入URL,它会自己获取URL代码。如果你有兴趣,你可以试试。
CSS 选择器
pyquery库的这些基本属性和获取标签的方式是它最不起眼的优势,而它真正的优势就是上面提到的CSS选择器。
下面,我们给出分层访问的例子,以及直接访问的例子:
from pyquery import PyQuery as pq
with open('demo.html', 'r', encoding='utf-8') as f:
html = f.read()
doc = pq(html.strip())
print("直接获取class等于aaa的标签")
print(doc('.aaa'))
print("层级获取class等于aaa的标签")
print(doc('html body .ul .li .aaa'))
运行后是两个“Python section”标签的内容,这里就不展示了。
查找节点
其实学习了以上内容,如果想爬一个网站,已经可以掌握了。不过我们还是完整介绍了pyquery库,这里开始讲解它的节点搜索。
查找子节点
在实际的爬虫项目中,我们需要获取一个节点的子节点,那么怎么做呢?
比如这里我们获取了ul标签的所有子节点,示例如下:
from pyquery import PyQuery as pq
with open('demo.html', 'r', encoding='utf-8') as f:
html = f.read()
doc = pq(html)
print("find")
ul = doc('.ul1')
a_list = ul.find('a')
for a in a_list:
a = str(etree.tostring(a, pretty_print=True, encoding='UTF-8'), 'UTF-8')
if a.strip() != '':
print(a)
print("children")
ul = doc('.ul1')
a_list = ul.children('a')
for a in a_list:
a = a.html()
if a.strip() != '':
print(a)
运行后效果如下:
可以看到,这里的find()可以找到所有的子节点,但是children()什么都得不到,因为children得到的是直接子节点,find()得到的是后代节点。
找到父节点
在pyquery库中,可以使用parent()方法直接查找其父节点,使用parents()方法可以查找所有父节点。
这里,我们测试一下,找到最后一个标签的所有父节点和父节点,示例如下:
from pyquery import PyQuery as pq
with open('demo.html', 'r', encoding='utf-8') as f:
html = f.read()
doc = pq(html)
a = doc('.aaa')
print("获取其父节点")
print(a.parent())
print("获取其所有父节点")
for parent in a.parents():
print(parent.tag)
print("-----")
运行后效果如下:
找到它的兄弟姐妹
在pyquery库中,节点的兄弟姐妹可以通过siblings()方法找到,也可以通过CSS选择器参数找到。
让我们更新上面的 HTML-li 代码:
Python板块
<a>1111
</a>
一个例子如下:
from pyquery import PyQuery as pq
with open('demo.html', 'r', encoding='utf-8') as f:
html = f.read()
doc = pq(html)
li1 = doc(".li1")
print(li1.siblings())
print('针对属性查找兄弟节点')
print(li1.siblings('.li'))
运行后效果如下:
获取节点信息
节点信息包括节点的名称、属性、文本、整个节点的 HTML 代码以及其节点内部的 HTML 代码。下面,博主一一举例来获取:
from pyquery import PyQuery as pq
from lxml import etree
with open('demo.html', 'r', encoding='utf-8') as f:
html = f.read()
doc = pq(html)
a = doc('.li1')
print('节点名称:', a[0].tag)
print("节点属性:", a[0].get('class'))
print("节点属性:", a.attr('class'))
print("节点文本:", a.text())
print("整个节点HTML代码:", str(etree.tostring(a[0], pretty_print=True, encoding='UTF-8'), 'UTF-8'))
print("节点内部HTML代码:", a.html())
运行后效果如下:
需要注意的是,如果需要获取整个节点的html代码,需要使用lxml库来完成。如果获取的节点的父节点只有一个子节点,则可以通过获取父节点内部的html代码来获取整个节点。HTML代码,但是一般来说,一个父节点应该有很多子节点,这个不行,目前也没有好的解决方案,只能借助lxml库。
修改节点
博主记得我上大学的时候,学校网站很卡,毕业申请页面打不开。(人多一点就塌了)
这时候博主就拿了一招,直接下载了学校提交的网站源代码,然后把所有提交的信息写在对应的HTML标签中,然后直接提交。
然而,当时,博主是手动完成的。如果需要代码操作,可以使用pyquery库。例如,我们可以为标签添加文本、属性等。对应的代码如下:
from pyquery import PyQuery as pq
with open('demo.html', 'r', encoding='utf-8') as f:
html = f.read()
doc = pq(html)
# 添加一个标签的class属性值
li = doc('.li1')
li.add_class('li')
print(doc)
# 删除一个标签的class属性值
li.remove_class('li')
print(doc)
# 修改一个标签的class属性值
li.attr('class', 'li123')
print(doc)
# 修改一个标签的文本
a = doc('.aaa')
a.text('我是修改的值')
print(doc)
# 修改一个标签的HTML代码
a = doc('.aaa')
a.html('华为')
print(doc)
# 删除一个节点
li.remove()
print(doc)
运行结果就不放这里了,因为代码每次打印都会产生很多数据,而且博文中积累了很多图片,阅读体验不好,请见谅。如果您有兴趣自己复制和运行它。
但是,您需要特别注意一点。text() 方法是替换文本。如果 HTML 代码被替换,则需要使用 html() 方法。如果 text() 替换了 html 代码,会导致