我正在寻找一种方法(或函数)去掉任何提供给函数的URL的domain.ext部分.域扩展可以是任何东西(.com,.co.uk,.nl,.whatever),并且输入它的URL可以是从http://www.domain.com到www.domain.com/path的任何内容./script.php?=whatever
这是最好的方法吗?
需要一种方法来使用Python urlparse从URL中提取没有子域的域名.
例如,我想"google.com"
从一个完整的URL中提取出来"http://www.google.com"
.
我似乎最接近的urlparse
是netloc
属性,但它包括子域,在本例中它将是www.google.com
.
我知道可以编写一些自定义字符串操作来将www.google.com转换为google.com,但我希望在此任务中避免使用字符串转换或正则表达式.(原因是我对url形成规则不够熟悉,以确信我可以考虑编写自定义解析函数所需的每个边缘情况.)
或者,如果urlparse
不能做我需要的,有没有人知道任何其他Python url解析库?
我已经看了一下urlparse.urlparse
方法文档,我对这个parameters
部分有点困惑(不要与更熟悉的query
部分混淆,那就是在问号之后和片段部分之前).
关于URL结构的维基百科条目没有说明这一点,所以可以请任何人详细说明这一点并可能举一些例子吗?
我想用urlparse
.但是python3.4.1没有找到模块.
我这样做import urlparse
,但它给了我这个错误
importError: no 'module' named ulrparse
Run Code Online (Sandbox Code Playgroud) 我需要从这个URL获取查询字符串/sf/?next=1&value=3,我不想使用request.META.我已经发现有两种方法可以获取查询字符串:
使用urlparse urlparse.urlparse(url).query
使用url编码 使用urlencode并将request.GET params字典传递给它以获取字符串表示.
那么哪种方式更好?我的同事们更喜欢urlencode,但没有提供令人满意的解释.他们声称urlparse在内部调用urlencode,这是我不确定的,因为urlencode存在于urllib模块中.
我应该使用哪个URL解析函数对,为什么?
我需要解析一个URL.我目前正在使用urlparse.urlparse()和urlparse.urlsplit().
问题是,当不存在该方案时,我无法从URL获取"netloc"(主机).我的意思是,如果我有以下网址:
www.amazon.com/Programming-Python-Mark-Lutz/dp/0596158106/ref=sr_1_1?ie=UTF8&qid=1308060974&sr=8-1
我无法获得netloc:www.amazon.com
根据python文档:
遵循RFC 1808中的语法规范,只有在'//'正确引入的情况下,urlparse才会识别netloc.否则,输入被假定为相对URL,因此以路径组件开始.
所以,这是故意的.但是,我仍然不知道如何从该URL获取netloc.
我想我可以检查该方案是否存在,如果不存在,则添加它,然后解析它.但是这个解决方案看起来并不是很好.
你有更好的主意吗?
编辑: 谢谢你的所有答案.但是,我不能做Corey和其他人提出的"startwith"事情.如果我得到一个其他协议/方案的URL我会搞砸了.看到:
如果我得到这个网址:
ftp://something.com
Run Code Online (Sandbox Code Playgroud)
使用提议的代码,我会在开头添加"http://"并将其弄乱.
我发现的解决方案
if not urlparse.urlparse(url).scheme:
url = "http://"+url
return urlparse.urlparse(url)
Run Code Online (Sandbox Code Playgroud)
需要注意的事项:
我先做一些验证,如果没有给出方案,我认为它是http://
我想从url解析查询部分,这是我的代码:
>>> from urlparse import urlparse, parse_qs
>>> url = '/?param1¶m2=2'
>>> parse_qs(urlparse(url).query)
>>> {'param2': ['23']}
Run Code Online (Sandbox Code Playgroud)
此代码看起来不错,但"parse_qs"方法丢失了诸如"param1"或"param1 ="之类的查询参数.我可以用stantard库解析查询部分并保存所有参数吗?
我正在尝试编写一个脚本来测试网页是否存在,如果不下载整个页面就会检查它会很好.
这是我的跳跃点,我已经看到多个示例以相同的方式使用httplib,但是,我检查的每个站点都返回false.
import httplib
from httplib import HTTP
from urlparse import urlparse
def checkUrl(url):
p = urlparse(url)
h = HTTP(p[1])
h.putrequest('HEAD', p[2])
h.endheaders()
return h.getreply()[0] == httplib.OK
if __name__=="__main__":
print checkUrl("http://www.stackoverflow.com") # True
print checkUrl("http://stackoverflow.com/notarealpage.html") # False
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
编辑
有人建议这个,但他们的帖子被删除.. urllib2是否避免下载整个页面?
import urllib2
try:
urllib2.urlopen(some_url)
return True
except urllib2.URLError:
return False
Run Code Online (Sandbox Code Playgroud) urlparse.parse_qs
对于解析url参数非常有用,它可以通过简单的ASCII url工作str
.所以我可以解析一个查询,然后使用urllib.urlencode
解析后的数据构建相同的路径:
>>> import urlparse
>>> import urllib
>>>
>>> path = '/?key=value' #path is str
>>> query = urlparse.urlparse(path).query
>>> query
'key=value'
>>> query_dict = urlparse.parse_qs(query)
>>> query_dict
{'key': ['value']}
>>> '/?' + urllib.urlencode(query_dict, doseq=True)
'/?key=value' # <-- path is the same here
Run Code Online (Sandbox Code Playgroud)
当url包含百分比编码的非ASCII参数时,它也可以正常工作:
>>> value = urllib.quote(u'????????'.encode('utf8'))
>>> value
'%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5'
>>> path = '/?key=%s' % value
>>> path
'/?key=%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5'
>>> query = urlparse.urlparse(path).query
>>> query
'key=%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5'
>>> query_dict = urlparse.parse_qs(query)
>>> query_dict
{'key': …
Run Code Online (Sandbox Code Playgroud) urlparse ×10
python ×9
url ×3
django ×2
urlencode ×2
comparison ×1
httplib ×1
import ×1
importerror ×1
parsing ×1
php ×1
python-3.x ×1
url-parsing ×1
urllib ×1
urlsplit ×1