使用python 2.7.3,urllib和re,我正在寻找包含:
的网址href="/dirone/Dir_Two/dirthree/"
网址可能是,例如:
href="/dirone/Dir_Two/dirthree/5678-random-stuff-here-letters-and-numbers"
我想回来:
"/dirone/Dir_Two/dirthree/5678-random-stuff-here-letters-and-numbers"
使用此工具:
http://www.jslab.dk/tools.regex.php
我生成了正则表达式:
/^href\="\/dirone\/Dir_Two\/dirthree\/"$/im
这个正则表达式因此可以用python和re以下列方式使用:
object_name = re.findall('/^href\="\/dirone\/Dir_Two\/dirthree\/"$/im',url)
for single_url in object_name:
do something
答案 0 :(得分:2)
你真的想放弃^
锚点;我怀疑href
是否会出现在行的开头。
您不需要/im
部分,应该用re.
标志常量替换它们。你有Perl正则表达式语法,Python没有专门的/.../flags
语法。
因此有太多的转义并且没有实际的Python字符串。并且您实际上并未包含5678-random-stuff-here-letters-and-numbers
部分。
请改用:
object_name = re.findall(r'href="(/dirone/Dir_Two\/dirthree/[^"/]*)"', url, re.I)
我删除了多行标志,因为我们不再匹配已删除^
的字符串的开头。我在路径周围添加了一个组((...)
),以便findall()
返回那些而不是整个匹配。 [^"/]*
部分匹配任何字符而不是引号或斜杠来捕获文件名部分而不是另一个目录名。
简短演示:
>>> import re
>>> example = '<a href="/dirone/Dir_Two/dirthree/5678-random-stuff-here-letters-and-numbers">'
>>> re.findall(r'href="(/dirone/Dir_Two\/dirthree/[^"/]*)"', example, re.I)
['/dirone/Dir_Two/dirthree/5678-random-stuff-here-letters-and-numbers']
答案 1 :(得分:2)
与Martijn的答案类似,但假设您已获得HTML,则使用beautifulsoup
。
data = '<a href="/dirone/Dir_Two/dirthree/5678-random-stuff-here-letters-and-numbers">Content</a>'
from bs4 import BeautifulSoup
import re
soup = BeautifulSoup(data)
print [el['href'] for el in soup('a', href=re.compile('^/dirone/Dir_Two/.*'))]