如何从 url 中提取标题?
how to extract a headline form a url?
我有一个标题数据集,例如
http://www.whosebug.com/lifestyle/tech/this-is-a-very-nice-headline-my-friend/2013/04/26/acjhrjk-2e1-1krjke4-9el8c-2eheje_story.html?tid=sm_fb
http://www.whosebug.com/2015/07/15/sports/baseball/another-very-nice.html?smid=tw-somedia&seid=auto
http://worldnews.stack.com/news/2013/07/22/54216-hello-another-one-here?lite
http://www.stack.com/article_email/hello-one-here-that-is-cool-1545545554-lMyQjAxMTAHFJELMDgxWj
http://www.stack.com/2013/11/13/tech/tricky-one/the-real-one/index.html
http://www.stack.com/2013/11/13/tech/the-good-one.html
http://www.stack.com/news/science-and-technology/54512-hello-world-here-is-a-weird-character#b02g07f20b14
我需要从这些 link 中提取正确的标题,即:
- this-is-a-very-nice-headline-my-friend
- another-very-nice
- hello-another-one-here
- hello-one-here-that-is-cool
- the-real-one
- the-good-one
- hello-world-here-is-a-weird-character
所以规则似乎找到 最长的 形式的字符串 word1-word2-word3
- 在右边界或左边界有一个 /
并且 没有考虑
- 超过 3 位数的单词(例如第一个
acjhrjk-2e1-1krjke4-9el8c-2eheje
link,或第三个 54216
,
- 不包括像
.html
. 这样的东西
如何在 Python 中使用 regex 来做到这一点?不幸的是,我相信正则表达式是这里唯一可行的解决方案。 yurl
或 urlparse
等包可以捕获 url 的路径,但后来我又回到使用正则表达式来获取标题..
非常感谢!
毕竟,正则表达式可能不是您的最佳选择。
但是,根据您提出的规范,您可以执行以下操作:
import re
urls = ['http://www.whosebug.com/lifestyle/tech/this-is-a-very-nice-headline-my-friend/2013/04/26/acjhrjk-2e1-1krjke4-9el8c-2eheje_story.html?tid=sm_fb',
'http://www.whosebug.com/2015/07/15/sports/baseball/another-very-nice.html?smid=tw-somedia&seid=auto',
'http://worldnews.stack.com/news/2013/07/22/54216-hello-another-one-here?lite',
'http://www.stack.com/article_email/hello-one-here-that-is-cool-1545545554-lMyQjAxMTAHFJELMDgxWj',
'http://www.stack.com/2013/11/13/tech/tricky-one/the-real-one/index.html',
'http://www.stack.com/2013/11/13/tech/the-good-one.html',
'http://www.stack.com/news/science-and-technology/54512-hello-world-here-is-a-weird-character#b02g07f20b14']
regex = re.compile(r'(?<=/)([-\w]+)(?=[.?/#]|$)')
digits = re.compile(r'-?\d{3,}-?')
for url in urls:
substrings = regex.findall(url)
longest = max(substrings, key=len)
headline = re.sub(digits, '', longest)
print headline
这将打印
this-is-a-very-nice-headline-my-friend
another-very-nice
hello-another-one-here
hello-one-here-that-is-coollMyQjAxMTAHFJELMDgxWj
the-real-one
the-good-one
hello-world-here-is-a-weird-character
说明
这里,正则表达式使用 lookarounds 来寻找后面的 /
和前面的 .?/#
之一。捕获中间的任何单词字符和破折号。
这不是很具体,但如果您正在寻找最长的子串并在之后消除超过三个连续数字,这可能是一个很好的起点。
正如评论中已经说过的那样,使用语言工具可能会更好。
我有一个标题数据集,例如
http://www.whosebug.com/lifestyle/tech/this-is-a-very-nice-headline-my-friend/2013/04/26/acjhrjk-2e1-1krjke4-9el8c-2eheje_story.html?tid=sm_fb
http://www.whosebug.com/2015/07/15/sports/baseball/another-very-nice.html?smid=tw-somedia&seid=auto
http://worldnews.stack.com/news/2013/07/22/54216-hello-another-one-here?lite
http://www.stack.com/article_email/hello-one-here-that-is-cool-1545545554-lMyQjAxMTAHFJELMDgxWj
http://www.stack.com/2013/11/13/tech/tricky-one/the-real-one/index.html
http://www.stack.com/2013/11/13/tech/the-good-one.html
http://www.stack.com/news/science-and-technology/54512-hello-world-here-is-a-weird-character#b02g07f20b14
我需要从这些 link 中提取正确的标题,即:
- this-is-a-very-nice-headline-my-friend
- another-very-nice
- hello-another-one-here
- hello-one-here-that-is-cool
- the-real-one
- the-good-one
- hello-world-here-is-a-weird-character
所以规则似乎找到 最长的 形式的字符串 word1-word2-word3
- 在右边界或左边界有一个 /
并且 没有考虑
- 超过 3 位数的单词(例如第一个
acjhrjk-2e1-1krjke4-9el8c-2eheje
link,或第三个54216
, - 不包括像
.html
. 这样的东西
如何在 Python 中使用 regex 来做到这一点?不幸的是,我相信正则表达式是这里唯一可行的解决方案。 yurl
或 urlparse
等包可以捕获 url 的路径,但后来我又回到使用正则表达式来获取标题..
非常感谢!
毕竟,正则表达式可能不是您的最佳选择。
但是,根据您提出的规范,您可以执行以下操作:
import re
urls = ['http://www.whosebug.com/lifestyle/tech/this-is-a-very-nice-headline-my-friend/2013/04/26/acjhrjk-2e1-1krjke4-9el8c-2eheje_story.html?tid=sm_fb',
'http://www.whosebug.com/2015/07/15/sports/baseball/another-very-nice.html?smid=tw-somedia&seid=auto',
'http://worldnews.stack.com/news/2013/07/22/54216-hello-another-one-here?lite',
'http://www.stack.com/article_email/hello-one-here-that-is-cool-1545545554-lMyQjAxMTAHFJELMDgxWj',
'http://www.stack.com/2013/11/13/tech/tricky-one/the-real-one/index.html',
'http://www.stack.com/2013/11/13/tech/the-good-one.html',
'http://www.stack.com/news/science-and-technology/54512-hello-world-here-is-a-weird-character#b02g07f20b14']
regex = re.compile(r'(?<=/)([-\w]+)(?=[.?/#]|$)')
digits = re.compile(r'-?\d{3,}-?')
for url in urls:
substrings = regex.findall(url)
longest = max(substrings, key=len)
headline = re.sub(digits, '', longest)
print headline
这将打印
this-is-a-very-nice-headline-my-friend
another-very-nice
hello-another-one-here
hello-one-here-that-is-coollMyQjAxMTAHFJELMDgxWj
the-real-one
the-good-one
hello-world-here-is-a-weird-character
说明
这里,正则表达式使用 lookarounds 来寻找后面的 /
和前面的 .?/#
之一。捕获中间的任何单词字符和破折号。
这不是很具体,但如果您正在寻找最长的子串并在之后消除超过三个连续数字,这可能是一个很好的起点。
正如评论中已经说过的那样,使用语言工具可能会更好。