2012-06-24 4 views
1

Я работаю над тем, что требует от меня получить все URL-адреса на странице. Кажется, это работает на большинстве веб-сайтов, которые я тестировал, например, microsoft.com, но он возвращает только три из google.com. Вот соответствующий исходный код:Получить все URL-адреса на странице Python


    import urllib 
    import time 
    import re 
    fwcURL = "http://www.microsoft.com" #URL to read 
    mylines = urllib.urlopen(fwcURL).readlines() 
    print "Found URLs:" 
    time.sleep(1) #Pause execution for a bit 
    for item in mylines: 
    if "http://" in item.lower(): #For http 
     print item[item.index("http://"):].split("'")[0].split('"')[0] # Remove ' and " from the end, for example in href= 
    if "https://" in item.lower(): #For https 
     print item[item.index("https://"):].split("'")[0].split('"')[0] # Ditto 

Если мой код может быть улучшен, или, если есть лучший способ сделать это, пожалуйста, ответьте. Заранее спасибо!

+3

Вы пробовали BeautifulSoup? –

+0

Получение всех URL-адресов на странице в основном является пауком ... – gabeio

ответ

2

Во-первых, HTML не является обычным языком, и никакие простые манипуляции с строкой, подобные этим, не будут работать на всех страницах. Вам нужен настоящий HTML-парсер. Я бы рекомендовал Lxml. Тогда это просто вопрос рекурсии через дерево и поиск элементов, которые вы хотите.

Во-вторых, некоторые страницы могут быть динамическими, поэтому вы не найдете все содержимое источника html. Google активно использует javascript и AJAX (обратите внимание, как он отображает результаты без перезагрузки страницы).

+0

+1 для комментариев о сайтах, которые сильно используют JS/Ajax. – Felix

3

Попробуйте использовать Mechanize или BeautifulSoup или lxml.

Используя BeautifulSoup, вы можете легко легко получить весь контент html/xml.

import urllib2 
from BeautifulSoup import BeautifulSoup 
page = urllib2.urlopen("some_url") 
soup = BeautifulSoup(page.read()) 
links = soup.findAll("a") 
for link in links: 
    print link["href"] 

BeautifulSoup очень легко узнать и понять.

2

Я хотел бы использовать LXML и сделать:

import lxml.html 

page = lxml.html.parse('http://www.microsoft.com').getroot() 
anchors = page.findall('a') 

Стоит отметить, что если ссылки генерируются динамически (с помощью JS или аналогичный), то вы не получите те короткие автоматизации браузера каким-либо образом.

Смежные вопросы