Веб-соскоб наиболее часто встречающиеся имена - PullRequest
2 голосов
/ 01 мая 2019

Мне нужно отсканировать веб-страницу и найти пять наиболее часто встречающихся имен. Ожидаемый результат должен выглядеть как

[
    ('Anna Pavlovna', 7), 
    ('the prince', 7), 
    ('the Empress', 3), 
    ('Theprince', 3), 
    ('Prince Vasili', 2),
]

Мой код считает наиболее частые имена, но вместо этого вывод выглядит так:

 [(<span class="green">Anna Pavlovna</span>, 7),
 (<span class="green">the prince</span>, 7),
 (<span class="green">the Empress</span>, 3),
 (<span class="green">The prince</span>, 3),
 (<span class="green">Prince Vasili</span>, 2)]

Что я могу сделать, чтобы мой вывод выглядел как пример вывода?

import nltk

from urllib.request import urlopen
from bs4 import BeautifulSoup
html=urlopen('http://www.pythonscraping.com/pages/warandpeace.html')
soup=BeautifulSoup(html,'html.parser')

nameList = soup.findAll("span", {"class":"green"})  # may use bsObj.find_all()


fdist1 = nltk.FreqDist(nameList)
fdist1.most_common(5)

Ответы [ 2 ]

1 голос
/ 01 мая 2019

Просто измените эту строку:

nameList = soup.findAll("span", {"class":"green"})

к этому:

nameList = [tag.text for tag in soup.findAll("span", {"class":"green"})]

функция findAll возвращает список тегов, чтобы получить текст внутри тегов, которые вы используете text.

1 голос
/ 01 мая 2019

На странице отображается ошибка 502 Bad Gateway, но я думаю, что знаю, в чем ваша проблема.Когда вы используете findAll, он дает вам элементы bs4 вместо строк.Из-за этого вам нужно преобразовать его в строку с помощью чего-то вроде obj.get_text (). см. Документацию

items = soup.findAll("span", {"class": "green"})
texts = [item.get_text() for item in items]
# Now you have the texts of the span elements

Кстати, ваш пример кода неверен, поскольку bsObj не будет определен.

...