Создание новых столбцов путем очистки информации - PullRequest
1 голос
/ 05 апреля 2020

Я пытаюсь добавить информацию из веб-сайта в столбцы. У меня есть набор данных, который выглядит следующим образом:

COL1   COL2    COL3
...     ...    bbc.co.uk

, и я хотел бы иметь набор данных, который включает новые столбцы:

 COL1   COL2    COL3          Website Address   Last Analysis   Blacklist Status \  
...     ...    bbc.co.uk

IP Address  Server Location    City       Region

Эти новые столбцы взяты с этого веб-сайта: https://www.urlvoid.com/scan/bbc.co.uk. Мне нужно будет заполнить каждый столбец соответствующей информацией.

Например:

  COL1   COL2    COL3          Website Address   Last Analysis   Blacklist Status \  
...     ...    bbc.co.uk         Bbc.co.uk         9 days ago       0/35

Domain Registration               IP Address       Server Location    City       Region
1996-08-01 | 24 years ago       151.101.64.81    (US) United States   Unknown    Unknown

К сожалению, у меня возникли некоторые проблемы при создании новых столбцов и заполнении их информацией, скопированной с сайта. У меня может быть больше сайтов для проверки, не только bb c .co.uk. Пожалуйста, смотрите ниже используемый код. Я уверен, что есть лучший (и менее запутанный) подход к этому. Я был бы очень признателен, если бы вы помогли мне разобраться. Спасибо

РЕДАКТИРОВАТЬ:

Как показано в примере выше, к уже существующему набору данных, включающему три столбца (col1, col2 and col3), я должен добавить также поля, которые поступают из очистки (Website Address,Last Analysis,Blacklist Status, ...) ). Поэтому для каждого URL я должен иметь информацию, связанную с ним (например, bbc.co.uk в примере).

 COL1   COL2    COL3          Website Address   Last Analysis   Blacklist Status \  
...     ...    bbc.co.uk          Bbc.co.uk         9 days ago       0/35
...     ...    stackoverflow.com
...     ...    ...


IP Address  Server Location    City       Region
  COL1   COL2    COL3          Website Address   Last Analysis   Blacklist Status \  
...     ...    bbc.co.uk         Bbc.co.uk         9 days ago       0/35
...     ...    stackoverflow.com Stackoverflow.com  7 days ago      0/35


Domain Registration               IP Address       Server Location    ...
996-08-01 | 24 years ago       151.101.64.81    (US) United States    ...
2003-12-26 | 17 years ago      ...

(формат не очень хороший, но я думаю, что этого может быть достаточно, чтобы дать вам представление об ожидаемом результате).

Обновленный код:

urls= ['bbc.co.uk', 'stackoverflow.com', ...]

for x in urls:
        print(x)
        r = requests.get('https://www.urlvoid.com/scan/'+x)
        soup = BeautifulSoup(r.content, 'lxml')
        tab = soup.select("table.table.table-custom.table-striped")
        dat = tab[0].select('tr')
        for d in dat:
                row = d.select('td')
                original_dataset[row[0].text]=row[1].text

К сожалению, есть кое-что, что я делаю неправильно, так как он копирует только информацию из первого URL, проверенного на веб-сайте (т. Е. Bb c .co.uk), во все строки нового столбца.

Ответы [ 2 ]

1 голос
/ 05 апреля 2020

Дайте мне знать, если это то, что вы ищете:

cols = ['Col1','Col2']
rows = ['something','something else']
my_df= pd.DataFrame(rows,index=cols).transpose()
my_df

Получите ваш существующий код из этой строки:

dat = tab[0].select('tr')

добавьте:

for d in dat:
    row = d.select('td')
    my_df[row[0].text]=row[1].text
my_df

Вывод (извините за форматирование):

    Col1       Col2       Website Address   Last Analysis   Blacklist Status    Domain Registration     Domain Information  IP Address  Reverse DNS     ASN     Server Location     Latitude\Longitude  City    Region
0   something   something else  Bbc.com     11 days ago  |  Rescan  0/35    1989-07-15 | 31 years ago   WHOIS Lookup | DNS Records | Ping   151.101.192.81   Find Websites  |  IPVoid  |  ...   Unknown     AS54113 FASTLY  (US) United States  37.751 / -97.822   Google Map   Unknown     Unknown

Редактировать:

Чтобы сделать это с несколькими URL, попробуйте что-то вроде этого:

urls = ['bbc.com', 'stackoverflow.com']
ares = []
for u in urls:
    url = 'https://www.urlvoid.com/scan/'+u
    r = requests.get(url)
    ares.append(r)
rows = []
cols = []
for ar in ares:
    soup = bs(ar.content, 'lxml')
    tab = soup.select("table.table.table-custom.table-striped")        
    dat = tab[0].select('tr')
    line= []
    header=[]
    for d in dat:
        row = d.select('td')
        line.append(row[1].text)
        new_header = row[0].text
        if not new_header in cols:
            cols.append(new_header)

    rows.append(line)

my_df = pd.DataFrame(rows,columns=cols)   
my_df

Вывод :

Website Address     Last Analysis   Blacklist Status    Domain Registration     Domain Information  IP Address  Reverse DNS     ASN     Server Location     Latitude\Longitude  City    Region
0   Bbc.com     12 days ago  |  Rescan  0/35    1989-07-15 | 31 years ago   WHOIS Lookup | DNS Records | Ping   151.101.192.81   Find Websites  |  IPVoid  |  ...   Unknown     AS54113 FASTLY  (US) United States  37.751 / -97.822   Google Map   Unknown     Unknown
1   Stackoverflow.com   5 minutes ago  |  Rescan    0/35    2003-12-26 | 17 years ago   WHOIS Lookup | DNS Records | Ping   151.101.1.69   Find Websites  |  IPVoid  |  Whois   Unknown     AS54113 FASTLY  (US) United States  37.751 / -97.822   Google Map   Unknown     Unknown

Обратите внимание, что в нем нет двух ваших существующих столбцов (поскольку я не знаю, какие они есть), поэтому вам придется добавить их отдельно к кадру данных.

0 голосов
/ 05 апреля 2020

Вы можете использовать более простой способ извлечения данных, используя метод pandas read_ html. Вот мой снимок -

import pandas as pd

df = pd.read_html("https://www.urlvoid.com/scan/bbc.co.uk/")[0]

df_transpose = df.T

Теперь у вас есть необходимые транспонированные данные. Вы можете удалить ненужные столбцы, если хотите. После этого все, что вам нужно сделать сейчас, - это согласовать его с существующим набором данных. Учитывая, что вы можете загрузить свой набор данных как pandas фрейм данных, вы можете просто использовать для этого функцию concat (ось = 1 - объединять в столбцы):

pd.concat([df_transpose, existing_dataset], axis=1)

См. Документы pandas по слиянию / объединение: http://pandas.pydata.org/pandas-docs/stable/merging.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...