爬虫——利用xpath插件爬取段子

# 项目需求:利用Xpath 获取段子的内容和作者  https://ishuo.cn/joke 
import requests
from lxml import etree

# 指定url
url='https://ishuo.cn/joke'
headers={
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36"
}

# 发起页面请求
response=requests.get(url=url,headers=headers)

# 获取页面内容
page_text= response.text

# 数据解析
tree=etree.HTML(page_text)
# 获取所有的内容标签 用插件先测试语法 
# xpath()函数返回的是列表,列表元素是element对象,可以继续调用xpath函数继续解析
#  ./ 表示标签下

li_list = tree.xpath('//*[@id="list"]/ul/li')
    
#持久化存储
with open('./duanzi.txt','w',encoding='utf-8') as f:
    for li in li_list:
        content = li.xpath('./div[@class="content"]/text()')[0]
        title = li.xpath('./div[@class="info"]/a/text()')[0]
        f.write(title+":"+content+"\n\n")
print('完成')

小结:

  • xpath返回的是列表,索引取值
  • 内容来源于网络用etree.HTML(),本地用etree.parse()
  • 生成树之后xpath解析之后是element对象,还可以继续xpath
  • 注意xpath常用语法编写,可以利用插件先测试
  • 不要忘了./ title = li.xpath('./div[@class="info"]/a/text()')[0]
### 常用xpath表达式回顾
属性定位:
    #找到class属性值为song的div标签
    //div[@class="song"] 
层级&索引定位:
    #找到class属性值为tang的div的直系子标签ul下的第二个子标签li下的直系子标签a
    //div[@class="tang"]/ul/li[2]/a
逻辑运算:
    #找到href属性值为空且class属性值为du的a标签
    //a[@href="" and @class="du"]
模糊匹配:
    //div[contains(@class, "ng")]
    //div[starts-with(@class, "ta")]
取文本:
    # /表示获取某个标签下的文本内容
    # //表示获取某个标签下的文本内容和所有子标签下的文本内容
    //div[@class="song"]/p[1]/text()
    //div[@class="tang"]//text()
取属性:
    //div[@class="tang"]//li[2]/a/@href





from lxml import etree

# 1创建etree对象进行指定数据解析
tree = etree.parse('./text.html')

# 2调用xpath --》属性定位
#tree.xpath('//div[@class="song"] ') ----tree.xpth()--->列表

# 3层级索引定位
#tree.xpath('//div[@class="tang"]/ul/li[2]/a')

# 4逻辑定位
 #找到href属性值为空且class属性值为du的a标签
#tree.xpath('//a[@href="" and @class="du"]')

# 5模糊匹配
# class 中有ng字符
#tree.xpath('//div[contains(@class, "ng")]')
#tree.xpath('//div[starts-with(@class, "ta")]')

# 6取文本
# /表示获取某个标签下的文本内容

#tree.xpath('//div[@class="song"]/p[1]/text()')

# //表示获取某个标签下的文本内容和所有子标签下的文本内容
#tree.xpath('//div[@class="tang"]//text()')

# 7取属性
tree.xpath('//div[@class="tang"]//li[2]/a/@href')

学习:
https://www.cnblogs.com/foremostxl/p/10066312.html

你可能感兴趣的:(爬虫,xpath插件爬取)