同一行中的所有链接

时间:2017-07-05 08:36:23

标签: sql postgresql python-2.7

我正在做一个有两列的数据库: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[:]

1 个答案:

答案 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()即可删除它们。