2015-10-21 2 views
0

Я пытаюсь извлечь все заглавные фильмы из списка, который я Царапины: Я пытаюсь использовать регулярное выражение, чтобы сделать этоИзвлечение всех слов капитала из списка (Python3)

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' 

Не знаю почему, но я знаю, что это что-то делать с моим кодом регулярных выражений:

caps = re.findall('([A-Z]+(?=\s[A-Z]+)(?:\s[A-Z]+)+)', new) 

Как это исправить?

+0

Нужно ли это с помощью регулярного выражения? 'all (char.isupper() для char в заголовке)' должен делать трюк – inspectorG4dget

+1

Я думаю, что он имеет отношение к форматированию строки нового. Поскольку вы использовали re.sub для замены всего, что не является новой строкой, буквой или пробелом, тогда первая строка производителя (т. Е. Warner bros, fox и т. Д.) Включается в строку. –

+0

Как я могу это исправить? – user3682157

ответ

1

Используйте это вместо этого.

caps = re.findall('([A-Z]+(?:(?!\s?[A-Z][a-z])\s?[A-Z])+)', new) 

, чтобы следующее слово было не просто заглавным словом. Я не могу проверить это, поэтому я не знаю наверняка, если это сработает.

EDIT:

Извиняюсь, последний не имеет смысла, когда я на самом деле думал об этом. Он был изменен на тот, который должен работать

+0

Same Issue с ​​дополнительным капиталом при запуске этого – user3682157

+0

проверить изменение, согласно Debuggex, это сработало на дате выборки «BEASTS OF NO NATIONNw» «EVEREST Univ» «THE MARTIANFos» –

+0

сейчас работает - спасибо! – user3682157

1

Проблема в том, что soup.body.find_all(lambda tag: tag != 'script', recursive=False) возвращает только 3 элемента. Третий, кажется, весь текст в теле с отключенными тегами. Таким образом, название вашего фильма прямо против названия вашей студии, например: MARTIANFox. Таким образом, схватив шапки от этого, вы получите THE MARTIANF.

Кроме того, просто глядя на шапки, вы пропустите такие вещи, как МИССИЯ: НЕВОЗМОЖНО - РОГУ НАЦИЯ из-за не-альфа-символов.

Как насчет этого вместо этого?

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>, чтобы закрыть его.

Смежные вопросы