繁体   English   中英

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

[英]Extract part of a url using pattern matching in 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/结尾的链接
但是上面的正则表达式选择了所有带有“about”字的链接

建议您使用适当的库来解析您的 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

产量:

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

或者

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

您还可以在 BeautifulSoup 中使用正则表达式:

r = requests.get("http://www.fairobserver.com/about/")
print([a["href"] for a in BeautifulSoup(r.content).find_all(
     "a", href=re.compile(".*/about/$|.*/about$"))])

根据您的评论说明准确匹配/about//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'))

这是输出:

http://www.fairobserver.com/about/: path is /about? True
http://www.fairobserver.com/about/interview/: path is /about? False
http://www.fairobserver.com/interview/about/: path is /about? False

重要的部分是urlparse(url.rstrip('/')).path == '/about' ,通过在解析之前去除尾随/规范化 url,这样我们就不必使用正则表达式。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM