#python #pandas #web-scraping #beautifulsoup #data-science
#python #pandas #очистка веб-страниц #beautifulsoup #наука о данных
Вопрос:
У меня есть фрейм данных, содержащий лиды (имена). Я пытаюсь найти в Интернете соответствующие данные, касающиеся этих потенциальных клиентов.
Я использую beautifulsoup и urllib для очистки данных. URL-адрес выглядит следующим образом :
url = u'https://www.website.com/SearchResults?query=' quote(str(df['name']))
Проблема в том, что для каждого вывода я получаю одни и те же данные, которые являются данными для последнего вывода в dataframe, из которого были извлечены данные.
всякий раз, когда я использую строковое имя вместо str(df[‘name’]), я получаю для конкретного вывода правильные данные, и это выглядит так :
url = u'https://www.website.com/SearchResults?query=' quote('this is a leads name')
Причина, по которой я думаю, что проблема конкретно связана с str(df[‘name’]), заключается в том, что всякий раз, когда я его удаляю, я успешно получаю данные, в противном случае я получаю для 100 000 лидов одни и те же данные. Единственная проблема в том, что для использования выводов из фрейма данных мне нужно использовать str.
Комментарии:
1. Что делает ваш
quote
метод?2.
df['name'].astype(str)
? илиdf['name'].apply(lambda x: str(x))
для операций по строке? Я не верю, что когда-либо использовалstr(df[col])
, поэтому я не уверен, что произойдет. Надеюсь, это поможет.
Ответ №1:
str(df)
вернет текстовое представление фрейма данных. Например
>>> pd.DataFrame({"col1":[1,2,3,4], "name":["row1","row2","row3","row4"]})
col1 name
0 1 row1
1 2 row2
2 3 row3
3 4 row4
текстовое представление для вышеуказанного фрейма данных вернет
col1 name
1 row1
2 row2
3 row3
4 row4
Итак, для выполнения операций по строке лучше всего использовать apply
функцию из dataframe.
>>> def search_url(search_lead):
... url = u'https://www.website.com/SearchResults?query=' search_lead
... print(url) #You can do your operation here
Используя приведенную выше функцию, используйте apply
>>> df.name.apply(lambda x: search_url(x))
https://www.website.com/SearchResults?query=row1
https://www.website.com/SearchResults?query=row2
https://www.website.com/SearchResults?query=row3
https://www.website.com/SearchResults?query=row4
0 None
1 None
2 None
3 None
Name: name, dtype: object
Вы можете выполнять очистку веб-страниц внутри функции. Надеюсь, этот ответ поможет вам.
Ответ №2:
Спасибо всем.
Я попробовал то, что вы, ребята, предложили. Что действительно сработало для меня, так это создание функции, которая будет получать данные из Интернета, а затем использовать цикл for для вызова функции для каждого имени пользователя в строке.
В двух словах это то, что я сделал :
Функция:
def getdata(name):
url = u'https://www.website.com/search?q=' quote(str(name))
.
.
.
return (data)
Цикл :
for i, row in df.iterrows():
leaddata = getdata(df.name[i])
list1.append(leaddata)
Затем я приступил к вставке списка в фрейм данных.