我是Python的新手。我正在学习正则表达式,但我需要帮助。
这是HTML源代码:
<a href="http://www.ptop.se" target="_blank">http://www.ptop.se</a>
我正在尝试编写仅打印出http://ptop.se
的工具。你能帮帮我吗?
答案 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答案:BeautifulSoup,HTMLParser和lxml。
答案 5 :(得分:1)
答案 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=["'](.*?)["']