多列表合并一个列表
我采集了一个网站的封面页,获取了多个列表页然后获取的文章是多个列表页,如何把这些列表合并为一个
请求频道页地址 A表示【频道页地址】
A
获取多个列表页 列表中的字母表示独立的 【列表页地址】
请求列表页获取文章页面;列表里面的数字代表的是独立的 【文章地址】
文章列表a
文章列表b
文章列表c
文章列表d
我现在用for循环取出来的是一个一个的列表。列表里面是文章地址。如何用for循环把这些文章列表合并为一个列表。 为啥非要用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_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()
qq1151985918 发表于 2021-6-12 08:29
为啥非要用for?直接相加就好了。
问题出在请求列表 这块下面, 不知道怎么写了 我不是第一个 发表于 2021-6-12 09:56
问题出在请求列表 这块下面, 不知道怎么写了
>>> a=
>>> b=
>>> a.extend(b)
>>> a
>>> b.extend(a)
>>> b
>>> a.extend(b)
>>> a
>>> 我不是第一个 发表于 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()
Twilight6 发表于 2021-6-12 11:09
for 循环这里直接改成这样就行 :
谢谢,搞定了{:5_109:} wp231957 发表于 2021-6-12 10:12
>>> a=
>>> b=
>>> a.extend(b)
谢谢。。。{:5_109:} 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]