欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Xpath的string(.)用法

程序员文章站 2024-03-11 21:49:19
...

Xpath的string(.)用法

Xpath的text()与string(.)

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

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

Xpath的string(.)用法
发现我们确实拿到了,可是我们却是拿到一个列表中的多个字符串,我们想合成一个还需要拼接,所以我们可以使用 string(.),来看看效果
Xpath的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

相关标签: Xpath python