从XML中提取Python中的URL

0 投票
5 回答
2573 浏览
提问于 2025-04-17 19:53

我看了一个关于从字符串中提取网址的讨论。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)

这段代码依然表示“一个或多个不是空格的字符”,但额外加上了不包括双引号的条件。所以整体表达的意思是“一个或多个不是空格并且不是双引号的字符。”

撰写回答