Xpath的string(.)用法
程序员文章站
2024-03-11 21:49:19
...
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