检索同一域中网页的所有URL,但没有媒体或锚点

时间:2016-10-09 18:50:22

标签: python-2.7 web-scraping

我是Python的新手,对我所掌握的图书馆数量印象深刻。我有一个函数已经使用Beautiful Soup从站点中提取URL,但并非所有这些都是相关的。我只想在同一个网站(域或子域,但没有其他域)上使用网页(无媒体)。我尝试手动编写我遇到的示例,但我觉得我正在重新发明轮子 - 这肯定是互联网应用程序中的常见问题。

以下是我可能从网站上检索的网址示例列表,例如http://example.com,其中包含我是否需要这些网址以及原因的标记。希望这说明了这个问题。

好:

  • example.com/page - 它链接到同一域中的另一个页面
  • example.com/page.html - 文件类型已结束,但它是一个HTML页面
  • subdomain.example.com/page.html - 它位于同一网站上,但位于子域名
  • /about/us - 它是一个相对链接,所以它没有域名,但暗示

为:

  • otherexample.com/page - 糟糕,域名不匹配
  • example.com/image.jpg - 糟糕,不是图片,不是网页
  • / - 糟糕 - 有时只会在" a"中出现斜线。标记,但这是对我已经在
  • 页面的引用
  • #anchor - 这也是一个相对链接,但它位于同一页面上,所以不需要它

我已经在if陈述中为每个案例撰写案例......但必须有更好的方法!

编辑:这是我当前的代码,它不会返回任何内容:

ignore_values = {"", "/"}
def desired_links(href):
     # ignore if href is not set
     if not href:
         return False

     # ignore if it is just a link to the same page
     if href.startswith("#"):
         return False

     # skip ignored values
     if href in ignore_values:
         return False


 def explorePage(pageURL):
 #Get web page
     opener = urllib2.build_opener()
     opener.addheaders = [('User-Agent', 'Mozilla/5.0')]
     response = opener.open(pageURL)
     html = response.read()

     #Parse web page for links
     soup = BeautifulSoup(html, 'html.parser')
     links = [a["href"] for a in soup.find_all("a", href=desired_links)]
     for link in links:
         print(link)

     return



 def main():
     explorePage("http://xkcd.com")

1 个答案:

答案 0 :(得分:2)

BeautifulSoup可以非常灵活地帮助您创建属性值并将其应用于属性值。您可以创建https://docs.djangoproject.com/en/1.10/howto/deployment/wsgi/modwsgi/#daemon-mode并将其用作href的{​​{1}}参数的值。

例如,您可以从以下内容开始:

find_all()

用法:

ignore_values = {"", "/"}
def desired_links(href):
    # ignore if href is not set
    if not href:
        return False

    # ignore if it is just a link to the same page
    if href.startswith("#"):
        return False

    # skip ignored values
    if href in ignore_values:
        return False

    # TODO: more rules
    # you would probably need "urlparse" package for a proper url analysis

    return True

您应该查看links = [a["href"] for a in soup.find_all("a", href=desired_links)] 及其filtering function