从XML中提取Python中的URL
我看了一个关于从字符串中提取网址的讨论。https://stackoverflow.com/a/840014/326905 这个讨论真不错,我从一个包含 http://www.blabla.com 的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"']
但是我不知道怎么调整正则表达式,以去掉网址末尾的双引号。
我开始以为这个是关键
re.findall(r'(https?://\S+\")', s)
或者这个
re.findall(r'(https?://\S+\Z")', s)
但其实都不是。
有没有人能帮我一下,告诉我怎么去掉末尾的双引号?
顺便问一下,https后面的问号表示“s”可以出现也可以不出现。我说得对吗?
5 个回答
1
我之前用这段代码从文本中提取网址:
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']
1
你已经在使用字符类(虽然是简写版)。我建议稍微修改一下字符类,这样你就不需要使用前瞻了。只需把引号作为字符类的一部分添加进去:
re.findall(r'(https?://[^\s"]+)', s)
这段代码依然表示“一个或多个不是空格的字符”,但额外加上了不包括双引号的条件。所以整体表达的意思是“一个或多个不是空格并且不是双引号的字符。”