鱼C论坛

 找回密码
 立即注册
查看: 2164|回复: 8

[已解决]多列表合并一个列表

[复制链接]
发表于 2021-6-12 08:27:11 | 显示全部楼层 |阅读模式

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

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

x
我采集了一个网站的封面页,获取了多个列表页
然后获取的文章是多个列表页,如何把这些列表合并为一个

请求频道页地址     A表示【频道页地址】
A

获取多个列表页    列表中的字母表示独立的 【列表页地址】
[a,b,c,d]

请求列表页获取文章页面;列表里面的数字代表的是独立的 【文章地址】
文章列表a
[1,2,3,4,5,6,7,8,9]

文章列表b
[1,2,3,4,5,6,7,8,9]

文章列表c
[1,2,3,4,5,6,7,8,9]

文章列表d
[1,2,3,4,5,6,7,8,9]


我现在用for循环取出来的是一个一个的列表。列表里面是文章地址。如何用for循环把这些文章列表合并为一个列表。
最佳答案
2021-6-12 11:09:57
我不是第一个 发表于 2021-6-12 09:18
我知道写加,但是不知道怎么写代码。。       我用的 +=  好像不管用。应该是写错了。贴代码给你看下。。

[b]
for 循环这里直接改成这样就行 :

  1. for k in h:
  2.     arc_href.extend([k])
复制代码


或者用加号:

  1. for k in h:
  2.     arc_href += [k]
复制代码


你直接对一个字符串使用 extend 肯定会将字符串先转化为列表后与列表合并的,导致你链接字符串全部被拆分开来,参考代码:

  1. import requests
  2. import re
  3. from lxml import etree


  4. class Zw:
  5.     def __init__(self):
  6.         self.index_url="http://www.zuowen.com/gaozhong/"
  7.         self.headers={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.71 Safari/537.36"}

  8.     def list_href(self,response): #请求封面页
  9.         index_str=response.xpath("//div[@class='taglist']/ul")
  10.         list_url=[]
  11.         for li in index_str:
  12.             list_url=li.xpath(".//a[@target='_blank']/@href")
  13.             # print(list_url)
  14.         return list_url

  15.     def arc_next(self,list_url): #请求列表页
  16.         arc_href=[]
  17.         for i in list_url:
  18.             list_str=requests.get(i,headers=self.headers)
  19.             list_str1 = etree.HTML(list_str.text)
  20.             list_str2=list_str1.xpath("//div[@class='artlist']/div[@class='artlist_l']")
  21.             for arc in list_str2:
  22.                 h=arc.xpath("./div/div[@class='artbox_l_t']/a/@href")
  23.                 arc_href +=h
  24.                 for k in h:
  25.                     arc_href.extend([k])
  26.                     
  27.         return arc_href

  28.     def arc_body(self,arc_href): #请求详情页
  29.         for url in arc_href:
  30.             html1=requests.get(url)
  31.             html1.encoding='gb2312'
  32.             html = etree.HTML(html1.text)
  33.             title=html.xpath("//h1[@class='h_title']/text()")
  34.             #data=re.findall("<p style="text-align:center;padding:10px">20\d{2}-\d{2}-\d{2}.*?</p>",html1)
  35.             body=''.join(html.xpath("//div[@class='con_content']/*/text()")).strip()
  36.             # print(title)
  37.             # print(body)
  38.             print('----------')
  39.         return title,body


  40.     def run(self):
  41.         #1 获取封面网址
  42.         index_str=requests.get(self.index_url,headers=self.headers)
  43.         response=etree.HTML(index_str.text)
  44.         #2 获取多个列表网址
  45.         list_url=self.list_href(response)
  46.         #3获取多个文章网址列表
  47.         arc_href=self.arc_next(list_url)
  48.         #4 获取数据
  49.         title,body=self.arc_body(arc_href)
  50.         #5 保存数据

  51. if __name__ == "__main__":
  52.     zuowen=Zw()
  53.     zuowen.run()
复制代码



[/b]
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-6-12 08:29:31 From FishC Mobile | 显示全部楼层
为啥非要用for?直接相加就好了。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-6-12 09:18:45 | 显示全部楼层
我知道写加,但是不知道怎么写代码。。       我用的 +=  好像不管用。应该是写错了。贴代码给你看下。。
  1. import requests
  2. import re
  3. from lxml import etree


  4. class Zw:
  5.     def __init__(self):
  6.         self.index_url="http://www.zuowen.com/gaozhong/"
  7.         self.headers={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.71 Safari/537.36"}

  8.     def list_href(self,response): #请求封面页
  9.         index_str=response.xpath("//div[@class='taglist']/ul")
  10.         list_url=[]
  11.         for li in index_str:
  12.             list_url=li.xpath(".//a[@target='_blank']/@href")
  13.             # print(list_url)
  14.         return list_url

  15.     def arc_next(self,list_url): #请求列表页
  16.         arc_href=[]
  17.         for i in list_url:
  18.             list_str=requests.get(i,headers=self.headers)
  19.             list_str1 = etree.HTML(list_str.text)
  20.             list_str2=list_str1.xpath("//div[@class='artlist']/div[@class='artlist_l']")
  21.             for arc in list_str2:
  22.                 h=arc.xpath("./div/div[@class='artbox_l_t']/a/@href")
  23.                 arc_href +=h
  24.                 print(arc_href)
  25.                 # for k in h:
  26.                 #     # arc_href.extend(k)
  27.                 #     print(k)
  28.                 #     # arc_href +=k
  29.                 #     # print(arc_href)
  30.         return arc_href

  31.     def arc_body(self,arc_href): #请求详情页
  32.         for url in arc_href:
  33.             html1=requests.get(url)
  34.             html1.encoding='gb2312'
  35.             html = etree.HTML(html1.text)
  36.             title=html.xpath("//h1[@class='h_title']/text()")
  37.             #data=re.findall("<p style="text-align:center;padding:10px">20\d{2}-\d{2}-\d{2}.*?</p>",html1)
  38.             body=''.join(html.xpath("//div[@class='con_content']/*/text()")).strip()
  39.             # print(title)
  40.             # print(body)
  41.             print('----------')
  42.         return title,body


  43.     def run(self):
  44.         #1 获取封面网址
  45.         index_str=requests.get(self.index_url,headers=self.headers)
  46.         response=etree.HTML(index_str.text)
  47.         #2 获取多个列表网址
  48.         list_url=self.list_href(response)
  49.         #3获取多个文章网址列表
  50.         arc_href=self.arc_next(list_url)
  51.         #4 获取数据
  52.         title,body=self.arc_body(arc_href)
  53.         #5 保存数据

  54. if __name__ == "__main__":
  55.     zuowen=Zw()
  56.     zuowen.run()
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-6-12 09:56:38 | 显示全部楼层
qq1151985918 发表于 2021-6-12 08:29
为啥非要用for?直接相加就好了。

问题出在请求列表 这块下面, 不知道怎么写了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-6-12 10:12:51 | 显示全部楼层
我不是第一个 发表于 2021-6-12 09:56
问题出在请求列表 这块下面, 不知道怎么写了

>>> a=[1,2,3]
>>> b=[5,6,7]
>>> a.extend(b)
>>> a
[1, 2, 3, 5, 6, 7]
>>> b.extend(a)
>>> b
[5, 6, 7, 1, 2, 3, 5, 6, 7]
>>> a.extend(b)
>>> a
[1, 2, 3, 5, 6, 7, 5, 6, 7, 1, 2, 3, 5, 6, 7]
>>>
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-6-12 11:09:57 | 显示全部楼层    本楼为最佳答案   
我不是第一个 发表于 2021-6-12 09:18
我知道写加,但是不知道怎么写代码。。       我用的 +=  好像不管用。应该是写错了。贴代码给你看下。。

[b]
for 循环这里直接改成这样就行 :

  1. for k in h:
  2.     arc_href.extend([k])
复制代码


或者用加号:

  1. for k in h:
  2.     arc_href += [k]
复制代码


你直接对一个字符串使用 extend 肯定会将字符串先转化为列表后与列表合并的,导致你链接字符串全部被拆分开来,参考代码:

  1. import requests
  2. import re
  3. from lxml import etree


  4. class Zw:
  5.     def __init__(self):
  6.         self.index_url="http://www.zuowen.com/gaozhong/"
  7.         self.headers={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.71 Safari/537.36"}

  8.     def list_href(self,response): #请求封面页
  9.         index_str=response.xpath("//div[@class='taglist']/ul")
  10.         list_url=[]
  11.         for li in index_str:
  12.             list_url=li.xpath(".//a[@target='_blank']/@href")
  13.             # print(list_url)
  14.         return list_url

  15.     def arc_next(self,list_url): #请求列表页
  16.         arc_href=[]
  17.         for i in list_url:
  18.             list_str=requests.get(i,headers=self.headers)
  19.             list_str1 = etree.HTML(list_str.text)
  20.             list_str2=list_str1.xpath("//div[@class='artlist']/div[@class='artlist_l']")
  21.             for arc in list_str2:
  22.                 h=arc.xpath("./div/div[@class='artbox_l_t']/a/@href")
  23.                 arc_href +=h
  24.                 for k in h:
  25.                     arc_href.extend([k])
  26.                     
  27.         return arc_href

  28.     def arc_body(self,arc_href): #请求详情页
  29.         for url in arc_href:
  30.             html1=requests.get(url)
  31.             html1.encoding='gb2312'
  32.             html = etree.HTML(html1.text)
  33.             title=html.xpath("//h1[@class='h_title']/text()")
  34.             #data=re.findall("<p style="text-align:center;padding:10px">20\d{2}-\d{2}-\d{2}.*?</p>",html1)
  35.             body=''.join(html.xpath("//div[@class='con_content']/*/text()")).strip()
  36.             # print(title)
  37.             # print(body)
  38.             print('----------')
  39.         return title,body


  40.     def run(self):
  41.         #1 获取封面网址
  42.         index_str=requests.get(self.index_url,headers=self.headers)
  43.         response=etree.HTML(index_str.text)
  44.         #2 获取多个列表网址
  45.         list_url=self.list_href(response)
  46.         #3获取多个文章网址列表
  47.         arc_href=self.arc_next(list_url)
  48.         #4 获取数据
  49.         title,body=self.arc_body(arc_href)
  50.         #5 保存数据

  51. if __name__ == "__main__":
  52.     zuowen=Zw()
  53.     zuowen.run()
复制代码



[/b]
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-6-12 14:24:35 | 显示全部楼层
Twilight6 发表于 2021-6-12 11:09
for 循环这里直接改成这样就行 :

谢谢,搞定了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-6-12 14:26:49 | 显示全部楼层
wp231957 发表于 2021-6-12 10:12
>>> a=[1,2,3]
>>> b=[5,6,7]
>>> a.extend(b)

谢谢。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-6-13 15:59:53 | 显示全部楼层
Twilight6 发表于 2021-6-12 11:09
for 循环这里直接改成这样就行 :

大佬,我在代码原基础上加了获取列表分页,报错了。不知道什么原因能帮忙看下吗。。?

  1. import requests
  2. import re
  3. from lxml import etree


  4. class Zw:
  5.     def __init__(self):
  6.         self.index_url="http://www.zuowen.com/gaozhong/"
  7.         self.headers={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.71 Safari/537.36"}

  8.     def list_href(self,response): #请求封面页  获取列表页
  9.         index_str=response.xpath("//div[@class='taglist']/ul")
  10.         list_allurl=[]
  11.         for li in index_str:
  12.             list_url=li.xpath(".//a[@target='_blank']/@href")

  13.             for all_li in list_url:  # 获取列表分页
  14.                 list_all_str = requests.get(all_li, headers=self.headers)
  15.                 list_all_str1 = etree.HTML(list_all_str.text)
  16.                 fysum=list_all_str1.xpath("//div[@class='artpage']/a/text()")[-2]
  17.                 for fnum in range(1,int(fysum)+1):
  18.                     if fnum==1:
  19.                         list_allurl=all_li
  20.                     else:
  21.                         list_allurl=all_li+'index_'+str(fnum)+'.shtml'
  22.                     print(list_allurl)
  23.         return list_allurl



  24.     def arc_next(self,list_allurl): #请求列表页  获取文章页
  25.         arc_href=[]
  26.         for i in list_allurl:
  27.             list_str=requests.get(i,headers=self.headers)
  28.             list_str1 = etree.HTML(list_str.text)
  29.             list_str2=list_str1.xpath("//div[@class='artlist']/div[@class='artlist_l']")
  30.             for arc in list_str2:
  31.                 h=arc.xpath("./div/div[@class='artbox_l_t']/a/@href")
  32.                 # print(h)
  33.                 for k in h:
  34.                     arc_href.extend([k])
  35.                     # arc_href += [k]
  36.         print(arc_href)
  37.         return arc_href

  38.     def arc_body(self,arc_href): #请求详情页   获取内容
  39.         for url in arc_href:
  40.             html1=requests.get(url)
  41.             html1.encoding='gb2312'
  42.             html = etree.HTML(html1.text)
  43.             title=html.xpath("//h1[@class='h_title']/text()")
  44.             #data=re.findall("<p style="text-align:center;padding:10px">20\d{2}-\d{2}-\d{2}.*?</p>",html1)
  45.             body=''.join(html.xpath("//div[@class='con_content']/*/text()")).strip()
  46.             # print(title)
  47.             # print(body)
  48.             print('----------')
  49.         return title,body


  50.     def run(self):
  51.         #1 获取封面网址
  52.         index_str=requests.get(self.index_url,headers=self.headers)
  53.         response=etree.HTML(index_str.text)
  54.         #2 获取多个列表网址
  55.         list_allurl=self.list_href(response)
  56.         #3获取多个文章网址列表
  57.         arc_href=self.arc_next(list_allurl)
  58.         #4 获取数据
  59.         title,body=self.arc_body(arc_href)
  60.         #5 保存数据

  61. if __name__ == "__main__":
  62.     zuowen=Zw()
  63.     zuowen.run()
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-22 18:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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