【问题标题】:Python web scraping - print only part of urlPython网页抓取 - 仅打印部分网址
【发布时间】:2013-08-12 15:17:00
【问题描述】:

我有一个 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

我尝试了一些正则表达式,但没有成功。

欢迎任何帮助。

【问题讨论】:

    标签: python regex url web screen-scraping


    【解决方案1】:

    使用urlparse.urlsplit() function 将 URL 拆分为多个组成部分:

    >>> 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'
    

    【讨论】:

    • 这会用到我...非常感谢!
    【解决方案2】:

    newurl.split('.com')[1] 应该可以解决问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-10
      • 2016-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-12
      相关资源
      最近更新 更多