Попытка получить только абсолютные ссылки с веб-страницы, используя BeautifulSoup - PullRequest
4 голосов
/ 23 марта 2010

Я читаю содержимое веб-страницы, используя BeautifulSoup. Я хочу просто взять <a href>, начинающийся с http://. Я знаю, что в BeautifulSoup вы можете искать по атрибутам. Я думаю, у меня просто проблема с синтаксисом. Я бы предположил, что это будет что-то вроде.

page = urllib2.urlopen("http://www.linkpages.com")
soup = BeautifulSoup(page)
for link in soup.findAll('a'):
    if link['href'].startswith('http://'):
        print links 

Но это возвращает:

Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
  File "C:\Python26\lib\BeautifulSoup.py", line 598, in __getitem__
    return self._getAttrMap()[key]
KeyError: 'href'

Есть идеи? Заранее спасибо.

EDIT Это не для какого-либо конкретного сайта. Скрипт получает URL от пользователя. Таким образом, внутренняя ссылка будет проблемой, поэтому я также хочу только <'a'> со страниц. Если я поверну его в сторону www.reddit.com, он анализирует начальные ссылки и получит следующее:

<a href="http://www.reddit.com/top/">top</a>
<a href="http://www.reddit.com/saved/">saved</a>
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
  File "C:\Python26\lib\BeautifulSoup.py", line 598, in __getitem__
    return self._getAttrMap()[key]
KeyError: 'href'

Ответы [ 4 ]

6 голосов
/ 23 марта 2010
from BeautifulSoup import BeautifulSoup
import re
import urllib2

page = urllib2.urlopen("http://www.linkpages.com")
soup = BeautifulSoup(page)
for link in soup.findAll('a', attrs={'href': re.compile("^http://")}):
    print link
1 голос
/ 23 марта 2010

Возможно, у вас есть <a> теги без href атрибутов? Возможно, цель внутренней ссылки?

0 голосов
/ 16 февраля 2013
f=open('Links.txt','w')
import urllib2
from bs4 import BeautifulSoup
url='http://www.redit.com'
page=urllib2.urlopen(url)
soup=BeautifulSoup(page)
atags=soup.find_all('a')
for item in atags:
    for x in item.attrs: 
        if x=='href':
            f.write(item.attrs[x]+',\n')
        else:
            continue
f.close()

Менее эффективное решение.

0 голосов
/ 23 марта 2010

Пожалуйста, дайте нам представление о том, что вы здесь анализируете - как указывает Эндрю, вполне вероятно, что есть некоторые якорные теги без связанных ссылок.

Если вы действительно хотите игнорировать их, вы можете обернуть их в блок try, а затем поймать с помощью

except KeyError: pass

Но у этого есть свои проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...