2015-05-30 4 views
4

Я проанализировал html-документ, содержащий javascript с beautifulsoup, и сумел изолировать javascript внутри него и преобразовать его в строку. Javascript выглядит следующим образом:Использование регулярных выражений для извлечения определенных URL-адресов в python

<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. Моя проблема в том, что есть еще один url с jpg из того же домена, что и 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

Вы можете использовать r'"(http.*?)"', чтобы получить URLs в тексте:

>>> 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'] 

анс для извлечения .html «S в списке адресов можно использовать 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'] 
1

Если формат всегда совпадает с {file:url ищет подстроку между кавычками следующие {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:[.

Смежные вопросы