2012-06-24 193 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源代码中找到所有的内容。谷歌大量使用JavaScript和AJAX(注意它是如何显示结果而不重新加载页面的)。

+0

+1对于大量使用JS/Ajax的网站发表评论。 – Felix

3

尝试使用机械化或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或类似的),那么您将无法获得这些短信以某种方式自动在浏览器中。