Python web scraping - 仅打印部分url

时间:2013-08-12 15:17:00

标签: python regex url web screen-scraping

我有一个Python网页抓取程序,可以从指定网站获取所有链接,之后我设法打印出每个链接和路径的域名。

代码:

import urllib
import re
import mechanize
from bs4 import BeautifulSoup
import urlparse
import cookielib

url = "http://www.sparkbrowser.com"

br = mechanize.Browser()
cj = cookielib.LWPCookieJar()
br.set_cookiejar(cj)
br.set_handle_robots(False)
br.set_handle_equiv(False)
br.set_handle_redirect(True)
br.set_handle_refresh(mechanize._http.HTTPRefreshProcessor(), max_time=1)
br.addheaders = [('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1')]
page = br.open(url, timeout=5)

htmlcontent = page.read()
soup = BeautifulSoup(htmlcontent)


for link in br.links(text_regex=re.compile('^((?!IMG).)*$')):
    newurl = urlparse.urljoin(link.base_url, link.url)
    base = link.base_url
    print base," - ",newurl

它得到了这样的结果:

http://www.sparkbrowser.com  -  http://www.sparkbrowser.com
http://www.sparkbrowser.com  -  http://sparkbrowser.com
http://www.sparkbrowser.com  -  http://www.sparkbrowser.com/index.php
http://www.sparkbrowser.com  -  http://www.sparkbrowser.com/download.php
http://www.sparkbrowser.com  -  http://www.sparkbrowser.com/about.php
http://www.sparkbrowser.com  -  http://www.sparkbrowser.com/features.php
http://www.sparkbrowser.com  -  http://www.sparkbrowser.com/spark.php

etc....

我想知道如何仅从指定地址获取sparkbrowser.comsparkbrowser

我知道如何分隔域名http://www.sparkbrowser.com和路径,但我不知道是否可以像我提到的那样打印部分URL

我尝试使用Regex,但我没有成功。

欢迎任何帮助。

2 个答案:

答案 0 :(得分:0)

使用urlparse.urlsplit() function将网址拆分为组成部分:

>>> from urlparse import urlsplit
>>> urlsplit('http://www.sparkbrowser.com/index.php')
SplitResult(scheme='http', netloc='www.sparkbrowser.com', path='/index.php', query='', fragment='')
>>> _.netloc
'www.sparkbrowser.com'

如果需要,您可以进一步分割.netloc值:

>>> '.'.join(res.netloc.split('.')[-2:])
'sparkbrowser.com'

或,(更好),使用publicsuffix library提取给定域名的公共后缀:

>>> from publicsuffix import PublicSuffixList
>>> psl = PublicSuffixList()
>>> psl.get_public_suffix(res.netloc)
'sparkbrowser.com'
>>> psl.get_public_suffix('www.example.domain.co.uk')
'domain.co.uk'

答案 1 :(得分:0)

newurl.split('。com')[1]应该这样做。