鱼C论坛

 找回密码
 立即注册
查看: 4329|回复: 7

[已解决]xpath如何获取两个span标签内的内容

[复制链接]
发表于 2020-12-14 14:29:45 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
各位大佬,最新想爬个小说来看,地址:http://minguodaomuwangshi.wddsnxn.org/,页面是按卷分类的,卷的名字和卷内每一章的span标签没有上下级的关系,如下图,统一都在div[@class="booklist clearfix"]这一级下面,请问有没有什么办法可以获取两个卷名span标签之间的所有章节span呢。
1.jpg
最佳答案
2020-12-14 16:38:17
本帖最后由 suchocolate 于 2020-12-14 18:54 编辑
罗同学 发表于 2020-12-14 16:00
大佬、不是这个需求啊,网页是有一个卷名,第一卷第二卷这种的,是想获取比如第一卷里面的所有标签,因为 ...


a空为章节标题,加入总结果列表,并记录其index,如果只取其中一部分内容,那么按照index标号range去取就可以了。

  1. import requests
  2. from lxml import etree


  3. def main():
  4.     url = 'http://minguodaomuwangshi.wddsnxn.org/'
  5.     headers = {'user-agent': 'firefox'}
  6.     r = requests.get(url, headers=headers)
  7.     html = etree.HTML(r.text)
  8.     vols = html.xpath('//div[@class="booklist clearfix"]/span[@class="v"]/text()')
  9.     vol_index = []
  10.     n = 0
  11.     result = []
  12.     spans = html.xpath('//div[@class="booklist clearfix"]/span')
  13.     for span in spans:
  14.         link = span.xpath('./a/@href')
  15.         text = span.xpath('./a/text()')
  16.         if link:
  17.             # print(text, link)
  18.             result.append([text[0], link[0]])
  19.         else:
  20.             result.append([vols[n]])
  21.             vol_index.append(len(result) - 1)
  22.             n = n + 1
  23.     print(f'章节inex:{vol_index}')
  24.     print(result)


  25. if __name__ == '__main__':
  26.     main()
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-12-14 15:46:04 | 显示全部楼层

  1. import requests
  2. from lxml import etree


  3. def main():
  4.     url = 'http://minguodaomuwangshi.wddsnxn.org/'
  5.     headers = {'user-agent': 'firefox'}
  6.     r = requests.get(url, headers=headers)
  7.     html = etree.HTML(r.text)
  8.     spans = html.xpath('//div[@class="booklist clearfix"]/span')
  9.     for span in spans:
  10.         link = span.xpath('./a/@href')
  11.         text = span.xpath('./a/text()')
  12.         print(text, link)


  13. if __name__ == '__main__':
  14.     main()
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-14 16:00:32 | 显示全部楼层

大佬、不是这个需求啊,网页是有一个卷名,第一卷第二卷这种的,是想获取比如第一卷里面的所有标签,因为卷名和章节的名字没有从属关系,就不知道怎么写
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-12-14 16:38:17 | 显示全部楼层    本楼为最佳答案   
本帖最后由 suchocolate 于 2020-12-14 18:54 编辑
罗同学 发表于 2020-12-14 16:00
大佬、不是这个需求啊,网页是有一个卷名,第一卷第二卷这种的,是想获取比如第一卷里面的所有标签,因为 ...


a空为章节标题,加入总结果列表,并记录其index,如果只取其中一部分内容,那么按照index标号range去取就可以了。

  1. import requests
  2. from lxml import etree


  3. def main():
  4.     url = 'http://minguodaomuwangshi.wddsnxn.org/'
  5.     headers = {'user-agent': 'firefox'}
  6.     r = requests.get(url, headers=headers)
  7.     html = etree.HTML(r.text)
  8.     vols = html.xpath('//div[@class="booklist clearfix"]/span[@class="v"]/text()')
  9.     vol_index = []
  10.     n = 0
  11.     result = []
  12.     spans = html.xpath('//div[@class="booklist clearfix"]/span')
  13.     for span in spans:
  14.         link = span.xpath('./a/@href')
  15.         text = span.xpath('./a/text()')
  16.         if link:
  17.             # print(text, link)
  18.             result.append([text[0], link[0]])
  19.         else:
  20.             result.append([vols[n]])
  21.             vol_index.append(len(result) - 1)
  22.             n = n + 1
  23.     print(f'章节inex:{vol_index}')
  24.     print(result)


  25. if __name__ == '__main__':
  26.     main()
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-14 18:54:50 | 显示全部楼层
尝试了xpath的模糊定位配合轴定位
  1. //span[contains(text(),"卷二")]/preceding-sibling::span[@class=""]
复制代码

勉强能满足楼主的需求,但这个只能满足当前书籍卷一采集的情况,批量采集可能行不通
后面的卷数(卷三  卷四等)用上面的更行不通,后来继续改换思路
  1. 卷一 //span[contains(text(),"全部")]/following-sibling::span[position()<70]

  2. 卷二 //span[contains(text(),"卷二")]/following-sibling::span[position()<72]

  3. 卷三 //span[contains(text(),"卷三")]/following-sibling::span[position()<75]

  4. 卷四 //span[contains(text(),"卷四")]/following-sibling::span[position()<79]

  5. 卷五 //span[contains(text(),"卷五")]/following-sibling::span[position()<80]

  6. 卷六 //span[contains(text(),"卷六")]/following-sibling::span[position()<81]

  7. 卷七 //span[contains(text(),"卷七")]/following-sibling::span[position()<70]
复制代码


如果是这样的话  分卷采集应该就没有问题了
主要还是网站的问题 如果分卷标题和分卷章节节点为父子关系,xpath写起来会容易很多


可惜不是悬赏贴 不然还能赚点鱼币
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-15 15:19:51 | 显示全部楼层
孤独的嫖客 发表于 2020-12-14 18:54
尝试了xpath的模糊定位配合轴定位
勉强能满足楼主的需求,但这个只能满足当前书籍卷一采集的情况,批量采集 ...

是啊是啊、要是节点有父子关系就好写了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-15 19:33:15 | 显示全部楼层
罗同学 发表于 2020-12-15 15:19
是啊是啊、要是节点有父子关系就好写了

应该我是最佳啊?
这节点都给你了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-15 19:53:12 | 显示全部楼层
为什么不直接用个循环...
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-30 09:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表