使用Python+;BeautifulSoup以串联方式提取标记,创建列表列表
我对python/BeautifulSoup有点陌生,我想知道我是否可以就如何完成以下内容获得一些指导 我有一个网页的html,其结构如下: 1) 包含所有图像名称(名称1、名称2、名称3)的标记中包含的代码块 2) 包含在具有图像URL的标记中的代码块 3) 出现在网页上的日期。我将其放入“date”变量中(该变量已被提取) 从代码中,我试图提取一个列表列表,其中包含[['image1'、'url1'、'date']、['image2'、'url2'、'date']],稍后我会将其转换为一个字典(通过dict(zip(labels,values))函数),并插入到mysql表中 我所能想到的就是如何提取包含所有图像和所有url的两个列表。你知道我要做什么吗 需要记住的几件事: 1) 图像的数量始终随名称变化(1:1) 2) 日期始终显示一次 另外,如果有更优雅的方法通过bs4提取数据,请让我知道使用Python+;BeautifulSoup以串联方式提取标记,创建列表列表,python,python-2.7,beautifulsoup,Python,Python 2.7,Beautifulsoup,我对python/BeautifulSoup有点陌生,我想知道我是否可以就如何完成以下内容获得一些指导 我有一个网页的html,其结构如下: 1) 包含所有图像名称(名称1、名称2、名称3)的标记中包含的代码块 2) 包含在具有图像URL的标记中的代码块 3) 出现在网页上的日期。我将其放入“date”变量中(该变量已被提取) 从代码中,我试图提取一个列表列表,其中包含[['image1'、'url1'、'date']、['image2'、'url2'、'date']],稍后我会将其转换为一个字
from bs4 import BeautifulSoup
name = []
url = []
date = '2017-10-12'
text = '<div class="tabs"> <ul><li> NAME1</li><li> NAME2</li><li> NAME3</li> </ul> <div><div><div class="img-wrapper"><img alt="" src="www.image1.com/1.jpg" title="image1.jpg"></img> </div> <center><a class="button print" href="javascript: w=window.open("www.image1.com/1.jpg); w.print();"> Print</a> </center></div><div> <div class="img-wrapper"><img alt="" src="www.image2.com/2.jpg" title="image2.jpg"></img> </div> <center><a class="button print" href="javascript: w=window.open("www.image2.com/2.jpg"); w.print();">Print</a> </center></div><div> <div class="img-wrapper"><img alt="" src="www.image1.com/3.jpg" title="image3.jpg"></img></div> <center><a class="button print" href="javascript: w=window.open("www.image1.com/3.jpg"); w.print();"> Print</a> </center></div> </div></div>'
soup = BeautifulSoup(text, 'lxml')
#print soup.prettify()
#get names
for imgz in soup.find_all('div', attrs={'class':'img-wrapper'}):
for imglinks in imgz.find_all('img', src = True):
#print imgz
url.append((imglinks['src']).encode("utf-8"))
#3 get ad URLS
for ultag in soup.find_all('ul'):
for litag in ultag.find_all('li'):
name.append((litag.text).encode("utf-8")) #dump all urls into a list
print url
print name
从bs4导入美化组
名称=[]
url=[]
日期='2017-10-12'
text='- NAME1
- NAME2
- NAME3
'
soup=BeautifulSoup(文本“lxml”)
#打印汤。美化
#取名字
对于汤中的imgz.find_all('div',attrs={'class':'img-wrapper'}):
对于imgz.find_all('img',src=True)中的imglinks:
#打印imgz
url.append((imglinks['src']).encode(“utf-8”))
#3获取广告URL
对于汤中的ultag。查找所有('ul'):
对于ultag中的litag.find_all('li'):
name.append((litag.text).encode(“utf-8”)#将所有URL转储到列表中
打印url
印刷品名称
这里有另一种可能的方法来提取URL和名称:
url = [tag.get('src') for tag in soup.find_all('img')]
name = [tag.text.strip() for tag in soup.find_all('li')]
print(url)
# ['www.image1.com/1.jpg', 'www.image2.com/2.jpg', 'www.image1.com/3.jpg']
print(name)
# ['NAME1', 'NAME2', 'NAME3']
至于最终列表的创建,这里有一些功能类似于@t.m.adam的建议:
print([pair + [date] for pair in list(map(list, zip(url, name)))])
# [['www.image1.com/1.jpg', 'NAME1', '2017-10-12'],
# ['www.image2.com/2.jpg', 'NAME2', '2017-10-12'],
# ['www.image1.com/3.jpg', 'NAME3', '2017-10-12']]
请注意,map
现在很少被使用,而且它的使用在美国是完全不被鼓励的
或:
values=[list(i)+[date]for i in-zip(name,url)]
类似的东西?天哪,是的。你为什么漫不经心地把它写进评论里,而不是作为答案?非常感谢。现在很忙。。但您可以回答并接受,这可能对其他读者有用。感谢您提供替代bs4解决方案,以及回答原始问题!看起来我需要更多的练习来帮助我编写更高效的bs4代码。
n = len(url)
print(list(map(list, zip(url, name, [date] * n))))
# [['www.image1.com/1.jpg', 'NAME1', '2017-10-12'], ['www.image2.com/2.jpg', 'NAME2', '2017-10-12'], ['www.image1.com/3.jpg', 'NAME3', '2017-10-12']]