使用正则表达式在Python中提取特定的URL

4

我已经使用BeautifulSoup解析了一个包含JavaScript的HTML文档,并成功将其中的JavaScript代码分离并转换为字符串。这段JavaScript代码如下:

<script>
    [irrelevant javascript code here]
    sources:[{file:"http://url.com/folder1/v.html",label:"label1"},
    {file:"http://url.com/folder2/v.html",label:"label2"},
    {file:"http://url.com/folder3/v.html",label:"label3"}],
    [irrelevant javascript code here]
</script>

我试图获取仅包含在此源数组中的url的数组,如下所示:

urls = ['http://url.com/folder1/v.html', 
        'http://url.com/folder2/v.html', 
        'http://url.com/folder3/v.html']

领域是未知的IP地址,文件夹名称由小写字母和数字随机组成,并且每个文件中都有1-5个它们(通常为3)。所有恒定的是它们以http开头,并以.html结尾。
我决定使用正则表达式来解决这个问题(我对此还很陌生),我的代码看起来像这样:urls=re.findall(r'http://[^t][^s"]+', document) [^t]在那里是因为文档中有其他以t开头的域名。我的问题是,还有另一个来自与我正在提取的urls相同域的jpg url,它与其他url一起放入了urls数组中。
例如:
urls = ['http://123.45.67.89/asodibfo3ribawoifbadsoifasdf3/v.html'
        'http://123.45.67.89/alwefaoewifiasdof224a/v.html',
        'http://123.45.67.89/baoisdbfai235oubodsfb45/v.html',
        'http://123.45.67.89/i/0123/12345/aoief243oinsdf.jpg']

我该如何只获取HTML网址?

3个回答

2

您可以使用r'"(http.*?)"'来获取文本中的URL:

>>> s="""<script>
...     [irrelevant javascript code here]
...     sources:[{file:"http://url.com/folder1/v.html",label:"label1"},
...     {file:"http://url.com/folder2/v.html",label:"label2"},
...     {file:"http://url.com/folder3/v.html",label:"label3"}],
...     [irrelevant javascript code here]
... </script>"""

>>> re.findall(r'"(http.*?)"',s,re.MULTILINE|re.DOTALL)
['http://url.com/folder1/v.html', 'http://url.com/folder2/v.html', 'http://url.com/folder3/v.html']

用于提取url列表中以 .html 结尾的答案可以使用 str.endswith
>>> urls = ['http://123.45.67.89/asodibfo3ribawoifbadsoifasdf3/v.html',
...         'http://123.45.67.89/alwefaoewifiasdof224a/v.html',
...         'http://123.45.67.89/baoisdbfai235oubodsfb45/v.html',
...         'http://123.45.67.89/i/0123/12345/aoief243oinsdf.jpg']
>>> 
>>> [i for i in urls if i.endswith('html')]
['http://123.45.67.89/asodibfo3ribawoifbadsoifasdf3/v.html', 
 'http://123.45.67.89/alwefaoewifiasdof224a/v.html', 
 'http://123.45.67.89/baoisdbfai235oubodsfb45/v.html']

另外,对于此类任务,您还可以使用fnmatch模块作为一种通用且灵活的方法:

>>> from fnmatch import fnmatch
>>> [i for i in urls if fnmatch(i,'*.html')]
['http://123.45.67.89/asodibfo3ribawoifbadsoifasdf3/v.html', 
 'http://123.45.67.89/alwefaoewifiasdof224a/v.html', 
 'http://123.45.67.89/baoisdbfai235oubodsfb45/v.html'] 

0
如果格式始终相同,使用{file:查找冒号后引号之间的子字符串。
s="""<script>
    [irrelevant javascript code here]
    sources:[{file:"http://url.com/folder1/v.html",label:"label1"},
    {file:"http://url.com/folder2/v.html",label:"label2"},
    {file:"http://url.com/folder3/v.html",label:"label3"}],
    [irrelevant javascript code here]
</script>"""


print(re.findall("\{file\:\"(.*?)\"",s))
['http://url.com/folder1/v.html', 'http://url.com/folder2/v.html', 'http://url.com/folder3/v.html']

你也可以通过在源上分割一次来限制要搜索的字符串:

s="""<script>
    [irrelevant javascript code here]
    sources:[{file:"http://url.com/folder1/v.html",label:"label1"},
    {file:"http://url.com/folder2/v.html",label:"label2"},
    {file:"http://url.com/folder3/v.html",label:"label3"}],
    [irrelevant javascript code here]
</script>"""

print(re.findall("\{file\:\"(.*?)\"",s.split("sources:[",1)[1]))

如果没有其他的sources:[,则会删除sources:[之前的所有其他行。


0

像这样的东西?

re.findall(r'http://[^t][^s"]+\.html', document)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接