Xpath的string(.)用法

Xpath的string(.)用法

Xpath的text()与string(.)

我们在爬取网站使用Xpath提取数据的时候,最常使用的就是Xpath的text()方法,该方法可以提取当前元素的信息,但是某些元素下包含很多嵌套元素,

我们想一并的提取出来,这时候就用到了string(.)方法,但是该方法使用的时候跟text()不太一样,下面就举实例来讲解一下具体的区别。
实例网站:https://www.qiushibaike.com/text/page(页码)
列如
在这里插入图片描述
在这里插入图片描述
以这个段子为例,如果我们使用text()来拿取这个,会发现这一个段子竟然有多个text()信息,那么我们直接用text()来拿会怎么样呢?我们来看下结果

在这里插入图片描述
发现我们确实拿到了,可是我们却是拿到一个列表中的多个字符串,我们想合成一个还需要拼接,所以我们可以使用 string(.),来看看效果
在这里插入图片描述
发现现在就是我们想要的结果了,因此当我们需要拿取嵌套节点的内容时候,使用string(.)方法效果更好

附上代码:

import requests
from fake_useragent import UserAgent
from lxml import etree

url = "https://www.qiushibaike.com/text/"

heardes ={
    'User-Agent':UserAgent().random
}

req =requests.get(url=url,headers=heardes)
html =etree.HTML(req.text)
item = html.xpath("//a[@class='contentHerf']/div[@class='content']/span[1]")
#获取每一个段子
for span in item:
    contents =span.xpath("string(.)")
    print(contents)

既然写到这里了就直接附上爬取整个网站的代码吧,网站比较简单,没事用来看看段子也还凑合

import requests
from threading import Thread
from queue import Queue
from fake_useragent import UserAgent
from lxml import etree


#爬取类
class Crawl_InIfo(Thread):

    def __init__(self,url_que,html_que):
        Thread.__init__(self)
        self.url_que =url_que
        self.html_que =html_que


    def run(self):

        headers ={
            "User-Agent" :UserAgent().random
        }

        while self.url_que.empty()==False:
            req = requests.get(url=self.url_que.get(),headers=headers)
            #
            if req.status_code == 200:
                # print(req.text)
                self.html_que.put(req.text)




#解析类
class PraseInFo(Thread):

    def __init__(self,html_que):
        Thread.__init__(self)
        self.html_que =html_que

    def run(self):
        while self.html_que.empty() ==False:
            e =etree.HTML(self.html_que.get())
            span_contents =e.xpath("//a[@class='contentHerf']/div[@class='content']/span[1]")
            author1 = e.xpath("//div[@class='author clearfix']/a[2]/h2/text()")
            #由于有的笑话比较长直接取文本不行
            for span ,author in zip(span_contents,author1):
                #格式化当前节点
                contents =span.xpath('string(.)')
                print(author,contents)

                with open('report.txt', 'a+', encoding='utf-8') as f:
                    f.write(author+'\n')
                    f.write(contents+'\n')






if __name__ == '__main__':
    # 存储url的容器
    url_que =Queue()
    #存储内容的容器
    html_que =Queue()
    for i in range(2,10):

        url = 'https://www.qiushibaike.com/text/page/{}/'.format(i)
        url_que.put(url)
        #创建一个爬虫
        # 生成3个线程
    crawl1_list =[]
    for i in range(0,3):
        crawl1 = Crawl_InIfo(url_que,html_que)
        crawl1_list.append(crawl1)
        crawl1.start()
    for crawl2 in crawl1_list:
        crawl2.join()
    print(html_que)
    parse =PraseInFo(html_que)

    parse.start()

参考链接: https://www.cnblogs.com/CYHISTW/p/12312570.html

  • 10
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值