《PYTHON3网络爬虫开发实践》——第四章 解析库的使用

第四章 解析库的使用

4.1 XPath

  • 对于网页的节点来说,它可以定义id、 class或其他属性。而且节点之间还有层次关系,在网页中可以通过XPath或CSS选择器来定位一一个或多个节点。那么,在页面解析时,利用XPath或CSS选择器来提取某个节点,然后再调用相应方法获取它的正文内容或者属性,就可以提取我们想要的任意信息了。

  • XPath提供了超过100个内建函数,用于字符串、数值、时间的匹配以及节点、序列的处理等。

  • XPath常用规则

    image-20190221095256688

    eg: //title[@lang=‘eng’]

    它代表选择所有名称为title,同时属性lang的值为eng的节点。

    eg:

    image-20190221095641003

    这里首先导人lxml库的etree模块,然后声明了一段HTML文本,调用HTML类进行初始化,这样就成功构造了一个XPath解析对象。这里需要注意的是,HTML文本中的最后一个li节点是没有闭合的,但是etree模块可以自动修正HTML文本。
    这里我们调用tostring()方法即可输出修正后的HTML代码,但是结果是bytes类型。这里利用decode()方法将其转成str类型,可以看到,经过处理之后,li节点标签被补全,并且还自动添加了body、html节点。

  • XPath选取所有节点。

    使用//开头。

    image-20190221100052589

    *代表匹配所有节点。返回形式是一个列表,每个元素是Element类型。

    也可以指定节点名称,比如获取所有li节点。要取出其中的一个对象,可以直接用中括号加索引,如[0]

    image-20190221100306454

  • XPath选取所有子节点

    /或//查找元素的子节点或子孙节点。

    /用于获取直接子节点。//用于获取子孙节点。

    比如想选择li节点的所有直接a子节点。

    image-20190221100543771

    image-20190221100611692

  • XPath选取父节点

    可以用…来实现,或者parent::来实现。

    比如,现在首先选中href属性为link4.html的a节点,然后再获取其父节点,然后再获取其class属性

    image-20190221100957271

    image-20190221101014195

  • XPath属性匹配

    可以用@符号进行属性过滤。

    image-20190221101242435

  • XPath文本获取

    两种方式:一是先选取a节点再获取文本,二是使用//

    image-20190221101515185

    image-20190221101531401

  • XPath属性获取

    用@符号就可以。比如获取所有li节点下所有a节点的href属性。

    注意和属性匹配的区别。属性匹配有[],比如[@href=“link1.html”],而属性获取没有[]

    image-20190221103125856

    image-20190221103141390

  • XPath属性多值匹配

    有些class属性里有多个值,如果还用之前的属性匹配就无法获取了,这时就用到contain()函数了。第一个参数传入属性名称,第二个参数传入属性值,只要此属性包含所传入的属性值,就可以完成匹配了。

    image-20190221103444181

    image-20190221103459363

  • XPath多属性匹配

    使用and、or、mod等运算法。

    image-20190221103725083

    image-20190221103738488

    image-20190221103816381

  • XPath按序选择

    可以利用中括号传入索引的方法获取特定次序的节点。

    XPath中提供了100多个函数,包括存取、数值、字符串、逻辑、节点、序列等,比如last()、position()等。P179

    image-20190221104044117

    image-20190221104054940

  • XPath节点轴选择

    包括获取子元素、兄弟元素、父元素、祖先元素等。

    image-20190221104322062

4.2 Beautiful Soup

  • Beautiful Soup解析器

    image-20190221104554655

    image-20190221104604293

  • Beautiful Soup基本用法

    image-20190221110619502

    image-20190221110634872

    首先声明的变量html,它是一个HTML字符串,并没有闭合。接着,我们将它当作第一个参数传给BeautifulSoup对象,使用lxml解析,此时就完成了BeaufulSoup对象的初始化。然后,将这个对象赋值给soup变量。
    首先,调用prettify()方法。把要解析的字符串以标准的缩进格式输出。
    然后调用soup. title.string,soup. title可以选出HTML中的title节点,再调用string属性就可以得到里面的文本了。

  • Beautiful Soup节点选择器

    直接调用节点的名称就可以选择节点元素。

    image-20190221134706309

    • 获取名称

      image-20190221134806824

    • 获取属性

      image-20190221134829131

    • 获取内容

      image-20190221134855377

  • 关联选择

    子节点、父节点、兄弟节点等。P186-P191

    image-20190221135537870

  • 方法选择器

    • find_all()

      • 可以根据节点名来查询元素

        image-20190222094220495

      • 除了根据节点名查询,我们也可以传入一些属性来查询

        image-20190222094247509

        image-20190222094257371

      • text参数可用来匹配节点的文本,传入的形式可以是字符串,可以是正则表达式对象。

        image-20190222094719482

    • find()

      find()方法返回的是单个元素,也就是第一个匹配的元素。find_all()返回的是所有匹配的元素组成的列表。

      image-20190222094934178

    • 还有一些其他的方法

      image-20190222095033001

      image-20190222095042667

  • Beautiful Soup——CSS选择器

    使用CSS选择器时,只需要调用select()方法,传入相应的CSS选择器即可。

    image-20190222095310884

    • select()方法同样支持嵌套选择。

      image-20190222095635944

    • 获取属性

      image-20190222095705403

    • 获取文本

      image-20190222095727906

4.3 pyquery

  • pyquery的初始化

    • pyquery的初始化方法有多种,比如直接传入字符串、传入URL、传入文件名等。

    • 字符串初始化

      image-20190222100036083

    • URL初始化

      image-20190222100202368

      这样的话,PyQuery 对象会首先请求这个URL,然后用得到的HTML内容完成初始化,这其实就相当于用网页的源代码以字符串的形式传递给PyQuery类来初始化。

    • 文件初始化

      传递本地的文件名,其内容是待解析的HTML字符串。

      image-20190222100357570

      以上3种初始化方式均可,当然最常用的初始化方式还是以字符串形式传递。

  • PyQuery基本CSS选择器

    image-20190222100639667

    image-20190222100653403

    这里我们初始化PyQuery对象之后,传入了一个CSS选择器#container .list li,它的意思是先选取id为container的节点,然后再选取其内部的class为list的节点内部的所有li节点。然后,打印输出。可以看到,我们成功获取到了符合条件的节点。
    最后,将它的类型打印输出。可以看到,它的类型依然是PyQuery类型。

  • PyQuery查找节点

    • 子节点(find())

      image-20190222101117367

    • 父节点(parent())

      image-20190222101142398

    • 兄弟节点(siblings())

      image-20190222101343316

      image-20190222101350843

    • 遍历

      image-20190222101454149

      image-20190222101506440

  • pyquery获取信息

    • 获取属性attr()

      image-20190222101738583

      image-20190222101749762

    • 获取文本text()

      image-20190222101833934

      image-20190222101849684

  • pyquery节点操作

    pyquery提供了一系列方法来对节点进行动态修改,比如为某个节点添加一个class,移除某个节点等,这些操作有时候会为提取信息带来极大的便利。

    • addClass和removeClass

      image-20190222102210482

      image-20190222102219890

    • attr、text和html

      当然,除了操作class这个属性外,也可以用attr()方法对属性进行操作。此外,还可以用text()和html()方法来改变节点内部的内容。

      image-20190222102403157

      image-20190222102415452

    • remove()

      image-20190222102518581

      image-20190222102529186

      image-20190222102541392

  • pyquery伪类选择器

    CSS选择器之所以强大,还有一个很重要的原因,那就是它支持多种多样的伪类选择器,例如选择第一个节点、最后一个节点、奇偶数节点、包含某一文本的节点等。

    image-20190222102711618

猜你喜欢

转载自blog.csdn.net/qq_39362996/article/details/88029172