我正在做一个有两列的数据库:event_name和event_URL。它没有获取名称并将所有URL放在event_URL列上。打印:https://prnt.sc/fru1tr
代码:
import urllib2
from bs4 import BeautifulSoup
import psycopg2
page = urllib2.urlopen('https://www.meetup.com/find/outdoors-adventure/?allMeetups=false&radius=50&userFreeform=London%2C+&mcId=c1012717&change=yes&sort=default')
soup = BeautifulSoup(page, 'lxml')
events = soup.find('ul', class_='j-groupCard-list searchResults tileGrid tileGrid--3col tileGrid_atMedium--2col tileGrid_atSmall--1col')
A = []
B = []
try:
conn = psycopg2.connect("dbname='meetup' user='postgres' host='localhost' password='root'")
except:
print 'Unable to connect to the database.'
cur = conn.cursor()
for event in events.findAll('li'):
text = event.findAll('h3')
if len(text) != 0:
A.append(text[0].find(text = True))
url = event.find('a', href=True)
if len(url) != 0:
B.append(url['href'])
cur.execute("""INSERT INTO outdoors_adventure(event_name,event_url) VALUES(%s,%s)""", (tuple(A),tuple(B)))
conn.commit()
del A[:]
del B[:]
答案 0 :(得分:0)
如果在发布的代码中缩进是正确的,则问题可能出现在嵌套的for循环中:对于每个事件,都附加" B"在页面上列出所有链接。你可以尝试:
for event in events.findAll('li'):
text = event.findAll('h3')
if len(text) != 0:
A.append(text[0].find(text = True))
for link in events.findAll('li'):
url = link.find('a', href=True)
if len(url) != 0:
B.append(url['href'])
或者更好的是,将事件名称和事件URL搜索保存在单个for循环中,首先获取文本,然后获取事件的URL
编辑:您可以使用以下方法简化名称提取:
for event in events.findAll('li'):
text = event.h3.string.strip()
if len(text) != 0:
A.append(text)
url = event.find('a', href=True)
...
让我知道这是否适合你(它在我身边)。
EDIT2:问题可能只是提取的字符串以制表符开头(也许这就是为什么你的数据库似乎"不显示名称" - 它在那里,但你只看到预览中的标签?)。只需使用strip()
即可删除它们。