我正试图从我已经删除的列表中提取所有大写电影: 我正在尝试使用正则表达式来执行此操作
Sub cpypaste()
Range("E7").Select
SendKeys ("^c"), True
Application.Wait (Now + TimeValue("00:00:01"))
Range("G7").Select
SendKeys ("^v"), True
End Sub
但是,我的输出会在我的电影结尾附加额外的大写字母
wikis = ["http://www.boxofficemojo.com/daily/chart/"]
for wiki in wikis:
website = requests.get(wiki)
soup = BeautifulSoup(website.content, "lxml")
text = ''.join([element.text for element in soup.body.find_all(lambda tag: tag != 'script', recursive=False)])
new = re.sub(r'[^a-zA-Z \n]','',text)
caps = re.findall('([A-Z]+(?=\s[A-Z]+)(?:\s[A-Z]+)+)', new)
不确定原因,但我知道它与我的正则表达式代码有关:
'BEASTS OF NO NATIONN'
'EVEREST U'
'THE MARTIANF'
我该如何解决这个问题?
答案 0 :(得分:1)
改为使用它。
caps = re.findall('([A-Z]+(?:(?!\s?[A-Z][a-z])\s?[A-Z])+)', new)
确保下一个单词不仅仅是大写单词。我不能检查这个,所以我不确定它是否会起作用。
编辑:
我道歉,一旦我真正想到它,最后一个没有任何意义。它已被更改为应该工作的
答案 1 :(得分:1)
问题是soup.body.find_all(lambda tag: tag != 'script', recursive=False)
只返回3个元素。第三个似乎是正文中的所有文本都删除了所有标签。因此,您的电影名称正好与您的工作室名称相对应,如下所示:THE MARTIANFox。所以抓住那个帽子会给你带来MARTIANF。
此外,只是寻找上限,你会因为非字母字符而错过MISSION:IMPOSSIBLE - ROGUE NATION等内容。
相反怎么样?
wikis = ["http://www.boxofficemojo.com/daily/chart/"]
for wiki in wikis:
website = requests.get(wiki)
caps = re.findall("<a href=\"/movies[^>]*>([^<a-z]*)</a>", website.content)
每部电影都在一个指向/电影的链接中,因此这是一种查找它们的简便方法。 <a href=\"movies[^>]*>
将匹配开始的锚标记,([^<a-z]*)
将匹配锚标记(电影标题)中没有小写字符的字符串,然后</a>
将其关闭。