在python中使用模式匹配提取url的一部分

2024-09-30 18:26:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我想使用python中的模式匹配从链接列表中提取url的一部分

示例:

http://www.fairobserver.com/about/
http://www.fairobserver.com/about/interview/

这是我的正则表达式:

re.match(r'(http?|ftp)(://[a-zA-Z0-9+&/@#%?=~_|!:,.;]*)(.\b[a-z]{1,3}\b)(/about[a-zA-Z-_]*/?)', str(href), re.IGNORECASE)  

我想得到只以/about/about/
结尾的链接 但是上面的regex选择了所有包含“about”单词的链接


Tags: recomhttpurl示例列表链接www
3条回答

建议您使用适当的库解析url,例如urlparse。在

例如

import urlparse

samples = [
  "http://www.fairobserver.com/about/",
  "http://www.fairobserver.com/about/interview/",
]

def about_filter(urls):
  for url in urls:
    parsed = urlparse.urlparse(url)
    if parsed.path.endswith('/about/'):
      yield url

屈服:

^{pr2}$

或者

def about_filter(urls):
  for url in urls:
    parsed = urlparse.urlparse(url)
    if parsed.path.startswith('/about'):
      yield url

屈服

>>> print list(about_filter(samples))
['http://www.fairobserver.com/about/', 'http://www.fairobserver.com/about/interview/']

如果您只希望链接以以下两种方式结束,请使用html解析器和str.endwith公司名称:

import requests

from bs4 import BeautifulSoup

r = requests.get("http://www.fairobserver.com/about/")
print(list(filter(lambda x: x.endswith(("/about", '/about/')),
                  (a["href"] for a in BeautifulSoup(r.content).find_all("a", href=True)))))

也可以将regex与beauthulsoup一起使用:

^{pr2}$

根据您的评论说明,完全匹配/about/或{}的路径。 下面是在python2/3中使用urlparse。在

try:
    # https://docs.python.org/3.5/library/urllib.parse.html?highlight=urlparse#urllib.parse.urlparse
    # python 3
    from urllib.parse import urlparse
except ImportError:
    # https://docs.python.org/2/library/urlparse.html#urlparse.urlparse
    # python 2
    from urlparse import urlparse

urls = (
    'http://www.fairobserver.com/about/',
    'http://www.fairobserver.com/about/interview/',
    'http://www.fairobserver.com/interview/about/',
)

for url in urls:
    print("{}: path is /about? {}".format(url,
          urlparse(url.rstrip('/')).path == '/about'))

输出如下:

^{pr2}$

重要的部分是urlparse(url.rstrip('/')).path == '/about',通过在解析之前去掉尾随的{}来规范化url,这样我们就不必使用regex了。在

相关问题 更多 >