从网站提取属性,然后使用pandas,Python中的bs4删除列表中的重复元素并将其写入.xls文件

时间:2019-03-29 14:02:44

标签: python pandas beautifulsoup

我是Python编程的初学者,我正在练习从网站抓取不同的值。我已经从特定网站提取了项目,现在想将它们写到.xls文件中。

该网页大约有715条记录,其中有重复记录。我使用了名为unique()的熊猫模块来删除重复的元素。这需要很长时间,并且该过程一直在进行,并且没有结束。我不知道是否要删除重复的记录。请说出我在哪里做错了,如果可能的话,建议要怎么做。

DECLARE @cantRemuneraciones INT;
DECLARE @cant INT = 0;
DECLARE @ruta NVARCHAR(MAX);
DECLARE @Parametros NVARCHAR(MAX);

SET @cantRemuneraciones = JSON_VALUE(@cTrama,'$.cantRemuneraciones');

WHILE @cant < @cantRemuneraciones
BEGIN

    SET @ruta = 'SELECT JSON_VALUE(@cTrama,REPLACE(''$.listaRemuneraciones[0].nPerConRemElemento'',''0'','+ CONVERT(VARCHAR(2),@cant) +'));';

    SET @Parametros = N'@cTrama NVARCHAR(MAX)';
    EXEC sp_executesql @ruta, @Parametros, @cTrama

    SET @cant = @cant +1;

END;

2 个答案:

答案 0 :(得分:1)

无需循环。所以代替:

    private RelayCommand _ligneAddCommand;

    public RelayCommand LigneAddCommand => _ligneAddCommand = _ligneAddCommand ?? new RelayCommand(LigneAddKeyDownEventHandle, LignaAddCanBeExecuted);

    protected virtual bool LignaAddCanBeExecuted() => true;

    protected virtual void LigneAddKeyDownEventHandle()
    {
        if (timer != null)
            timer.Stop();

        timer = new System.Windows.Threading.DispatcherTimer();
        timer.Tick += (s, args) =>
        {
            var t = s.ToString();
            timer.Stop();
        };
        timer.Interval = TimeSpan.FromMilliseconds(50);
        timer.Start();
    }

我只拿您的字典列表( for i in records: nl=pd.unique(name).tolist() pl=pd.unique(position).tolist() el=pd.unique(email).tolist() phl=pd.unique(phone).tolist() records.append({'Names': nl, 'Position': pl, 'Email': el, 'Phone': phl}) df = pd.DataFrame(records,columns=['Names','Position','Phone','Email']) ),转换为数据框

records

然后删除重复的行:

df = pd.DataFrame(records)    

我还向您的数据中添加了df = df.drop_duplicates() ,以删除电话号码和其他内容所占用的空白

.strip()

答案 1 :(得分:0)

您的代码需要花费很长时间,因为在第二个循环中,它会在对其进行迭代时追加到记录中,从而使该循环随每次迭代而扩展。要修复代码,您需要在第二个循环中更改变量名称。

因此,不要像这样在第二个循环中使用“ records”变量:

records.append({'Names': nl, 'Position': pl, 'Email': el, 'Phone': phl})

将其名称更改为“ unique_records”:

unique_records.append({'Names': nl, 'Position': pl, 'Email': el, 'Phone': phl})

这是完全更新的代码:

from bs4 import BeautifulSoup as bs
import pandas as pd
import requests

res = requests.get('https://www.raywhite.com/contact/?type=People&target=people&suburb=Sydney%2C+NSW+2000&radius=50%27%27&firstname=&lastname=&_so=contact', headers = {'User-agent': 'Super Bot 9000'})
soup = bs(res.content, 'lxml')

data = soup.find_all("div",{"class":"card horizontal-split vcard"})

records = []
unique_records = []

for item in data:
    name      = item.find('li', class_='agent-name').text
    position  = item.find('li',class_='agent-role').text
    phone     = item.find('li', class_='agent-officenum').text
    #link = item.find('li', class_='agent-name')['href']

    try:
        email = item.find('a', class_='val withicon')['href']
    except:
        email = 'No Email address'
    records.append({'Names':name,'Position':position,'Email':email,'Phone':phone})

for i in records:
    nl=pd.unique(name).tolist()
    pl=pd.unique(position).tolist()
    el=pd.unique(email).tolist()
    phl=pd.unique(phone).tolist()
    unique_records.append({'Names': nl, 'Position': pl, 'Email': el, 'Phone': phl})

df = pd.DataFrame(unique_records,columns=['Names','Position','Phone','Email'])
df.to_excel(r'C:\Users\laptop\Desktop\RayWhite.xls', sheet_name='MyData2', index = False, header=True)