正则表达式从HTML链接中提取URL

时间:2009-01-31 19:02:34

标签: python regex

我是Python的新手。我正在学习正则表达式,但我需要帮助。

这是HTML源代码:

<a href="http://www.ptop.se" target="_blank">http://www.ptop.se</a>

我正在尝试编写仅打印出http://ptop.se的工具。你能帮帮我吗?

10 个答案:

答案 0 :(得分:67)

如果您只想找一个:

import re
match = re.search(r'href=[\'"]?([^\'" >]+)', s)
if match:
    print match.group(0)

如果您有一个长字符串,并且想要其中的每个模式实例:

import re
urls = re.findall(r'href=[\'"]?([^\'" >]+)', s)
print ', '.join(urls)

s是您要查找的字符串匹配的位置。

正则表达式位的快速解释:

  

r'...'是一个“原始”字符串。它会阻止你像往常一样担心逃避角色。 (\特别是 - 在原始字符串中,\只是\。在常规字符串中,您每次都必须\\,并且< regexps中的em> old 。)

     

href=[\'"]?”表示匹配“href =”,可能后跟'"。 “可能”因为很难说你正在看的HTML有多可怕,并且引用并不是严格要求的。

     

将“()”中的下一位括起来表示将其分为“组”,这意味着将其拆分并单独返回给我们。这只是说“这是我感兴趣的模式的一部分。”

     

[^\'" >]+”表示匹配不是 '">或空格的任何字符。本质上,这是一个URL结尾的字符列表。它让我们避免尝试编写可靠匹配完整URL的正则表达式,这可能有点复杂。

使用BeautifulSoup的另一个答案的建议并不差,但确实引入了更高级别的外部要求。另外,它对你学习regexp的既定目标没有帮助,我认为这个特定的html解析项目只是其中的一部分。

这很容易做到:

from BeautifulSoup import BeautifulSoup
soup = BeautifulSoup(html_to_parse)
for tag in soup.findAll('a', href=True):
    print tag['href']

无论如何你已经安装了BeautifulSoup。

答案 1 :(得分:14)

请勿使用正则表达式,请使用BeautifulSoup。那个,或者是如此苛刻,以至于产生它,比如w3m / lynx并且回到w3m / lynx渲染的东西。第一个更优雅,第二个只是在我写的一些未经优化的代码上快了很多。

答案 2 :(得分:12)

这应该有效,尽管可能有更优雅的方式。

import re
url='<a href="http://www.ptop.se" target="_blank">http://www.ptop.se</a>'
r = re.compile('(?<=href=").*?(?=")')
r.findall(url)

答案 3 :(得分:10)

John Gruber(编写Markdown,由正则表达式组成并在Stack Overflow上使用)开始生成一个识别文本URL的正则表达式:

http://daringfireball.net/2009/11/liberal_regex_for_matching_urls

如果您只想获取URL(即您并未真正尝试解析HTML),这可能比HTML解析器更轻量级。

答案 4 :(得分:4)

正则表达式在解析HTML方面根本不好(请参阅Can you provide some examples of why it is hard to parse XML and HTML with a regex?了解原因)。你需要的是一个HTML解析器。有关使用各种解析器的示例,请参阅Can you provide an example of parsing HTML with your favorite parser?

特别要考虑Python答案:BeautifulSoupHTMLParserlxml

答案 5 :(得分:1)

regexlib

上有数吨

答案 6 :(得分:1)

是的,regexlib上有很多。这只能证明不应该使用RE来做到这一点。使用SGMLParser或BeautifulSoup或编写解析器 - 但不要使用RE。那些似乎有用的东西非常恭维,但仍未涵盖所有情况。

答案 7 :(得分:1)

使用可选匹配(在href=之后打印)并且仅获取链接时,这非常有效。在http://pythex.org/

上测试过
(?:href=['"])([:/.A-z?<_&\s=>0-9;-]+)

Oputput:

  

匹配1. / wiki / Main_Page

     

匹配2. / wiki / Portal:内容

     

匹配3. / wiki / Portal:Featured_content

     

匹配4. / wiki / Portal:Current_events

     

匹配5. / wiki /特殊:随机

     

匹配6. //donate.wikimedia.org/wiki/Special:FundraiserRedirector?utm_source=donate&utm_medium=sidebar&utm_campaign=C13_en.wikipedia.org&uselang=en

答案 8 :(得分:0)

这个正则表达式可以帮助你,你应该通过\ 1或者你的语言中的任何方法获得第一组。

href="([^"]*)

示例:

<a href="http://www.amghezi.com">amgheziName</a>

结果:

http://www.amghezi.com

答案 9 :(得分:0)

你可以使用它。

<a[^>]+href=["'](.*?)["']