2013-03-21 5 views
-1

Я прочитал эту тему об извлечении url из строки. https://stackoverflow.com/a/840014/326905 Действительно хороший, я получил все URLо, из документа XML, содержащего http://www.blabla.com сИзвлечение URL-адреса в Python из XML

>>> s = '<link href="http://www.blabla.com/blah" /> 
     <link href="http://www.blabla.com" />' 
>>> re.findall(r'(https?://\S+)', s) 
['http://www.blabla.com/blah"', 'http://www.blabla.com"'] 

Но я не могу понять, как настроить регулярное выражение опустить двойной qoute в конце URL.

Сначала я подумал, что это ключ

re.findall(r'(https?://\S+\")', s) 

или это

re.findall(r'(https?://\S+\Z")', s) 

, но это не так.

Может кто-нибудь помочь мне и рассказать мне, как опустить двойную цитату в конце?

КПП. вопросник после «s» https означает «s» может произойти или не может произойти. Я прав?

+1

НИКОГДА никогда никогда никогда никогда разбора HTML с регулярным выражением http://www.codinghorror.com/blog/2009/11/parsing-html-the-cthulhu-way.html – That1Guy

+0

Вы также должны прочитать нить [ RegEx сопоставляют открытые теги, кроме XHTML автономных тегов] (http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags) – Abhijit

+1

Если вы используете парсер HTML, например BeautifulSoup, эта проблема станет проще, чем использование регулярных выражений. –

ответ

1

Вы уже используете класс символов (пусть и сокращенную версию). Я могу предложить немного изменить класс символов, так что вам не нужен внешний вид. Просто добавьте цитату, как часть класса персонажа:

re.findall(r'(https?://[^\s"]+)', s) 

Это еще говорит «один или более символов не пробелами,» но есть добавление не включая двойные кавычки либо. Таким образом, общее выражение «один или несколько символов не пробел и не двойная кавычка».

1

Вы хотите двойные кавычки, чтобы выглядеть как заглядывая вперёд:

re.findall(r'(https?://\S+)(?=\")', s) 

Таким образом, они не будут отображаться как часть матча. Кроме того, да ? означает, что символ является необязательным.

Смотрите пример здесь: http://regexr.com?347nk

0

Спасибо. Я просто прочитал это https://stackoverflow.com/a/13057368/326905

и проверил это, что также работает.

re.findall(r'"(https?://\S+)"', urls) 
+0

yes, но если в тексте есть URL с другим символом, например "><", это не сработает. Например, для этого текста: «asd http://www.blabla.com> asdf» он вернет: ['http://www.blabla.com>'], что неверно! –

+0

Этого не происходит. Это правильный XML, но спасибо. – surfi

1

Я использовал для извлечения URL-адреса из текста через этот кусок кода:

url_rgx = re.compile(ur'(?i)\b((?:https?://|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:\'".,<>?\xab\xbb\u201c\u201d\u2018\u2019]))') 
# convert string to lower case 
text = text.lower() 
matches = re.findall(url_rgx, text) 
# patch the 'http://' part if it is missed 
urls = ['http://%s'%url[0] if not url[0].startswith('http') else url[0] for url in matches] 
print urls 

Он отлично работает!

2
>>>from lxml import html 
>>>ht = html.fromstring(s) 
>>>ht.xpath('//a/@href') 
['http://www.blabla.com/blah', 'http://www.blabla.com']