网页抓取手机号( CSS选择器库的基本属性和标签获取方式解析(一))

优采云 发布时间: 2022-03-03 19:18

  网页抓取手机号(

CSS选择器库的基本属性和标签获取方式解析(一))

  

  pyquery 库

  虽然 Beautiful Soup 库非常强大,但 CSS 选择器有些弱,至少对于 pyquery 库而言。

  而且pyquery库不是Python的标准库,所以在使用pyquery库之前需要安装。示例命令如下:

  pip install pyquery

  安装完成后,我们就可以愉快的玩一下pyquery库了。需要注意的是,后面的所有解析代码都是基于下面的HTML代码(实战除外):

  

我是一个测试页面

我的主页

CSDN首页

Python板块<a>>1111</a>

  基本用法

  在pyquery库中,有一个PyQuery类,我们拿到的HTML或者XML代码,需要通过它的构造函数来创建它的对象实例。

  示例代码(获取页面标题和所有标签的href属性值):

  from pyquery import PyQuery as pq

with open(&#39;demo.html&#39;, &#39;r&#39;, encoding=&#39;utf-8&#39;) as f:

html = f.read()

doc = pq(html.strip())

print(doc(&#39;title&#39;).text())

for a in doc(&#39;a&#39;):

print(a.get(&#39;href&#39;), a.text)

  运行后效果如下:

  

  pyquery库通过get获取属性的值,使用text()方法获取标签的文本信息。但是我们这里直接加载的文档,其实pq()可以直接传入URL,它会自己获取URL代码。如果你有兴趣,你可以试试。

  CSS 选择器

  pyquery库的这些基本属性和获取标签的方式是它最不起眼的优势,而它真正的优势就是上面提到的CSS选择器。

  下面,我们给出分层访问的例子,以及直接访问的例子:

  from pyquery import PyQuery as pq

with open(&#39;demo.html&#39;, &#39;r&#39;, encoding=&#39;utf-8&#39;) as f:

html = f.read()

doc = pq(html.strip())

print("直接获取class等于aaa的标签")

print(doc(&#39;.aaa&#39;))

print("层级获取class等于aaa的标签")

print(doc(&#39;html body .ul .li .aaa&#39;))

  运行后是两个“Python section”标签的内容,这里就不展示了。

  查找节点

  其实学习了以上内容,如果想爬一个网站,已经可以掌握了。不过我们还是完整介绍了pyquery库,这里开始讲解它的节点搜索。

  查找子节点

  在实际的爬虫项目中,我们需要获取一个节点的子节点,那么怎么做呢?

  比如这里我们获取了ul标签的所有子节点,示例如下:

  from pyquery import PyQuery as pq

with open(&#39;demo.html&#39;, &#39;r&#39;, encoding=&#39;utf-8&#39;) as f:

html = f.read()

doc = pq(html)

print("find")

ul = doc(&#39;.ul1&#39;)

a_list = ul.find(&#39;a&#39;)

for a in a_list:

a = str(etree.tostring(a, pretty_print=True, encoding=&#39;UTF-8&#39;), &#39;UTF-8&#39;)

if a.strip() != &#39;&#39;:

print(a)

print("children")

ul = doc(&#39;.ul1&#39;)

a_list = ul.children(&#39;a&#39;)

for a in a_list:

a = a.html()

if a.strip() != &#39;&#39;:

print(a)

  运行后效果如下:

  

  可以看到,这里的find()可以找到所有的子节点,但是children()什么都得不到,因为children得到的是直接子节点,find()得到的是后代节点。

  找到父节点

  在pyquery库中,可以使用parent()方法直接查找其父节点,使用parents()方法可以查找所有父节点。

  这里,我们测试一下,找到最后一个标签的所有父节点和父节点,示例如下:

  from pyquery import PyQuery as pq

with open(&#39;demo.html&#39;, &#39;r&#39;, encoding=&#39;utf-8&#39;) as f:

html = f.read()

doc = pq(html)

a = doc(&#39;.aaa&#39;)

print("获取其父节点")

print(a.parent())

print("获取其所有父节点")

for parent in a.parents():

print(parent.tag)

print("-----")

  运行后效果如下:

  

  找到它的兄弟姐妹

  在pyquery库中,节点的兄弟姐妹可以通过siblings()方法找到,也可以通过CSS选择器参数找到。

  让我们更新上面的 HTML-li 代码:

   我的主页

CSDN首页

Python板块

<a>1111

</a>

  一个例子如下:

  from pyquery import PyQuery as pq

with open(&#39;demo.html&#39;, &#39;r&#39;, encoding=&#39;utf-8&#39;) as f:

html = f.read()

doc = pq(html)

li1 = doc(".li1")

print(li1.siblings())

print(&#39;针对属性查找兄弟节点&#39;)

print(li1.siblings(&#39;.li&#39;))

  运行后效果如下:

  

  获取节点信息

  节点信息包括节点的名称、属性、文本、整个节点的 HTML 代码以及其节点内部的 HTML 代码。下面,博主一一举例来获取:

  from pyquery import PyQuery as pq

from lxml import etree

with open(&#39;demo.html&#39;, &#39;r&#39;, encoding=&#39;utf-8&#39;) as f:

html = f.read()

doc = pq(html)

a = doc(&#39;.li1&#39;)

print(&#39;节点名称:&#39;, a[0].tag)

print("节点属性:", a[0].get(&#39;class&#39;))

print("节点属性:", a.attr(&#39;class&#39;))

print("节点文本:", a.text())

print("整个节点HTML代码:", str(etree.tostring(a[0], pretty_print=True, encoding=&#39;UTF-8&#39;), &#39;UTF-8&#39;))

print("节点内部HTML代码:", a.html())

  运行后效果如下:

  

  需要注意的是,如果需要获取整个节点的html代码,需要使用lxml库来完成。如果获取的节点的父节点只有一个子节点,则可以通过获取父节点内部的html代码来获取整个节点。HTML代码,但是一般来说,一个父节点应该有很多子节点,这个不行,目前也没有好的解决方案,只能借助lxml库。

  修改节点

  博主记得我上大学的时候,学校网站很卡,毕业申请页面打不开。(人多一点就塌了)

  这时候博主就拿了一招,直接下载了学校提交的网站源代码,然后把所有提交的信息写在对应的HTML标签中,然后直接提交。

  然而,当时,博主是手动完成的。如果需要代码操作,可以使用pyquery库。例如,我们可以为标签添加文本、属性等。对应的代码如下:

  from pyquery import PyQuery as pq

with open(&#39;demo.html&#39;, &#39;r&#39;, encoding=&#39;utf-8&#39;) as f:

html = f.read()

doc = pq(html)

# 添加一个标签的class属性值

li = doc(&#39;.li1&#39;)

li.add_class(&#39;li&#39;)

print(doc)

# 删除一个标签的class属性值

li.remove_class(&#39;li&#39;)

print(doc)

# 修改一个标签的class属性值

li.attr(&#39;class&#39;, &#39;li123&#39;)

print(doc)

# 修改一个标签的文本

a = doc(&#39;.aaa&#39;)

a.text(&#39;我是修改的值&#39;)

print(doc)

# 修改一个标签的HTML代码

a = doc(&#39;.aaa&#39;)

a.html(&#39;华为&#39;)

print(doc)

# 删除一个节点

li.remove()

print(doc)

  运行结果就不放这里了,因为代码每次打印都会产生很多数据,而且博文中积累了很多图片,阅读体验不好,请见谅。如果您有兴趣自己复制和运行它。

  但是,您需要特别注意一点。text() 方法是替换文本。如果 HTML 代码被替换,则需要使用 html() 方法。如果 text() 替换了 html 代码,会导致

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线