鱼C论坛

 找回密码
 立即注册
查看: 1797|回复: 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 循环这里直接改成这样就行 :
for k in h:
    arc_href.extend([k])

或者用加号:
for k in h:
    arc_href += [k]

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


class Zw:
    def __init__(self):
        self.index_url="http://www.zuowen.com/gaozhong/"
        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"}

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

    def arc_next(self,list_url): #请求列表页
        arc_href=[]
        for i in list_url:
            list_str=requests.get(i,headers=self.headers)
            list_str1 = etree.HTML(list_str.text)
            list_str2=list_str1.xpath("//div[@class='artlist']/div[@class='artlist_l']")
            for arc in list_str2:
                h=arc.xpath("./div/div[@class='artbox_l_t']/a/@href")
                arc_href +=h
                for k in h:
                    arc_href.extend([k])
                    
        return arc_href

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


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

if __name__ == "__main__":
    zuowen=Zw()
    zuowen.run()


[/b]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-6-12 08:29:31 From FishC Mobile | 显示全部楼层
为啥非要用for?直接相加就好了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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


class Zw:
    def __init__(self):
        self.index_url="http://www.zuowen.com/gaozhong/"
        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"}

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

    def arc_next(self,list_url): #请求列表页
        arc_href=[]
        for i in list_url:
            list_str=requests.get(i,headers=self.headers)
            list_str1 = etree.HTML(list_str.text)
            list_str2=list_str1.xpath("//div[@class='artlist']/div[@class='artlist_l']")
            for arc in list_str2:
                h=arc.xpath("./div/div[@class='artbox_l_t']/a/@href")
                arc_href +=h
                print(arc_href)
                # for k in h:
                #     # arc_href.extend(k)
                #     print(k)
                #     # arc_href +=k
                #     # print(arc_href)
        return arc_href

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


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

if __name__ == "__main__":
    zuowen=Zw()
    zuowen.run()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

问题出在请求列表 这块下面, 不知道怎么写了
想知道小甲鱼最近在做啥?请访问 -> 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]
>>>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

[b]
for 循环这里直接改成这样就行 :
for k in h:
    arc_href.extend([k])

或者用加号:
for k in h:
    arc_href += [k]

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


class Zw:
    def __init__(self):
        self.index_url="http://www.zuowen.com/gaozhong/"
        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"}

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

    def arc_next(self,list_url): #请求列表页
        arc_href=[]
        for i in list_url:
            list_str=requests.get(i,headers=self.headers)
            list_str1 = etree.HTML(list_str.text)
            list_str2=list_str1.xpath("//div[@class='artlist']/div[@class='artlist_l']")
            for arc in list_str2:
                h=arc.xpath("./div/div[@class='artbox_l_t']/a/@href")
                arc_href +=h
                for k in h:
                    arc_href.extend([k])
                    
        return arc_href

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


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

if __name__ == "__main__":
    zuowen=Zw()
    zuowen.run()


[/b]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

谢谢,搞定了
想知道小甲鱼最近在做啥?请访问 -> 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)

谢谢。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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


class Zw:
    def __init__(self):
        self.index_url="http://www.zuowen.com/gaozhong/"
        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"}

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

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



    def arc_next(self,list_allurl): #请求列表页  获取文章页
        arc_href=[]
        for i in list_allurl:
            list_str=requests.get(i,headers=self.headers)
            list_str1 = etree.HTML(list_str.text)
            list_str2=list_str1.xpath("//div[@class='artlist']/div[@class='artlist_l']")
            for arc in list_str2:
                h=arc.xpath("./div/div[@class='artbox_l_t']/a/@href")
                # print(h)
                for k in h:
                    arc_href.extend([k])
                    # arc_href += [k]
        print(arc_href)
        return arc_href

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


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

if __name__ == "__main__":
    zuowen=Zw()
    zuowen.run()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-15 13:50

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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