我是Python的新手.我正在学习正则表达式,但我需要帮助.
这里是HTML源代码:
http://www.ptop.se
我正在尝试编写一个只打印出来的工具http://ptop.se
.你能帮我吗?
如果你只是在寻找一个:
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
您要查找的字符串在哪里匹配.
快速解释regexp位:
r'...'
是一个"原始"字符串.它会阻止你像往常一样担心逃避字符.(\
特别是 - 在原始字符串中a\
只是一个\
.在常规字符串中,\\
每次都必须这样做,并且在regexp 中会变老.)"
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.
不要使用正则表达式,使用BeautifulSoup.那个,或者是如此苛刻,以至于产生它,比如w3m/lynx并且回到w3m/lynx渲染的东西.首先是可能更优雅,第二次只是在一段时间内写的一些未经优化的代码上运行得更快.
这应该工作,虽然可能有更优雅的方式.
import re url='http://www.ptop.se' r = re.compile('(?<=href=").*?(?=")') r.findall(url)
John Gruber(编写Markdown,由正则表达式组成并在Stack Overflow上使用)开始生成一个识别文本URL的正则表达式:
http://daringfireball.net/2009/11/liberal_regex_for_matching_urls
如果您只想获取URL(即您并未真正尝试解析HTML),这可能比HTML解析器更轻量级.