我不是第一个 发表于 2021-6-12 08:27:11

多列表合并一个列表

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

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

获取多个列表页    列表中的字母表示独立的 【列表页地址】


请求列表页获取文章页面;列表里面的数字代表的是独立的 【文章地址】
文章列表a


文章列表b


文章列表c


文章列表d



我现在用for循环取出来的是一个一个的列表。列表里面是文章地址。如何用for循环把这些文章列表合并为一个列表。

qq1151985918 发表于 2021-6-12 08:29:31

为啥非要用for?直接相加就好了。

我不是第一个 发表于 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()

我不是第一个 发表于 2021-6-12 09:56:38

qq1151985918 发表于 2021-6-12 08:29
为啥非要用for?直接相加就好了。

问题出在请求列表 这块下面, 不知道怎么写了

wp231957 发表于 2021-6-12 10:12:51

我不是第一个 发表于 2021-6-12 09:56
问题出在请求列表 这块下面, 不知道怎么写了

>>> a=
>>> b=
>>> a.extend(b)
>>> a

>>> b.extend(a)
>>> b

>>> a.extend(b)
>>> a

>>>

Twilight6 发表于 2021-6-12 11:09:57

我不是第一个 发表于 2021-6-12 09:18
我知道写加,但是不知道怎么写代码。。       我用的 +=好像不管用。应该是写错了。贴代码给你看下。。


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

for k in h:
    arc_href.extend()

或者用加号:

for k in h:
    arc_href +=

你直接对一个字符串使用 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()
                  
      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()



我不是第一个 发表于 2021-6-12 14:24:35

Twilight6 发表于 2021-6-12 11:09
for 循环这里直接改成这样就行 :




谢谢,搞定了{:5_109:}

我不是第一个 发表于 2021-6-12 14:26:49

wp231957 发表于 2021-6-12 10:12
>>> a=
>>> b=
>>> a.extend(b)


谢谢。。。{:5_109:}

我不是第一个 发表于 2021-6-13 15:59:53

Twilight6 发表于 2021-6-12 11:09
for 循环这里直接改成这样就行 :




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

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()
                  # arc_href +=
      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()
页: [1]
查看完整版本: 多列表合并一个列表