MENU

使用Xpath解析xpath解析过的子节点(如何xpath Element下的子节点,并不重复)

November 7, 2020 • 数据采集与数据分析(python)

标题有点绕,容我慢慢道来~~~
情况是这样的:已经使用html=etree.HTML(str)构造了一个Xpath解析对象,并通过html.xpath(div)等到了div的Element。想继续解析出div节点下的p节点,但是问题出现了(见下图):
xpath子节点.png
因为得到N个div节点,所以使用for遍历每个div节点,并继续使用xpath解析其中p节点,但没想到的是出现了上图的情况。很多重复的信息,并且信息不全。这个问题困扰了一天。终于找到了解决办法,那就是:出现重复情况,说明xpath依然是解析整个页面,即<html>...</html>。所以使用规则表达式-当前节点“.”,加以修饰即可解决问题。下面让我们来试试:

xpath子节点02.png
果真解决了!

最后附上该模块的源代码:

from lxml import etree

class Rule():

    def __init__(self,name='bread'):
        self.name = name

    def parse(self,data):
        html = etree.HTML(data)
        card = html.xpath('//div[@class="card-wrap"]')       #返回list类型,里面包含所有div@class=card-wrap节点
        for item in card:                 #遍历每个div节点
         #print(etree.tostring(item,encoding='utf-8').decode('utf-8'))
            if len(item.xpath('.//p[@node-type="feed_list_content_full"]')):  #len(列表)如果是0说明没有这个节点
                author = item.xpath('.//p[@node-type="feed_list_content_full"]/@nick-name')
                print(author)
            else:
                author = item.xpath('.//p[@node-type="feed_list_content"]/@nick-name')
                print(author)