2017-02-16 7 views
2

Скребок в Интернете, чтобы получить стол, используя Beautiful soup и Pandas. Один из столбцов получил некоторые URL-адреса. Когда я передаю html в pandas, href теряются.как сохранить ссылки при очистке стола с красивым супом и пандами

есть ли способ сохранить ссылку на URL только для этой колонки?

Пример данных (отредактированы для лучшего костюма Ral случае):

<html> 
     <body> 
      <table> 
       <tr> 
       <td>customer</td> 
       <td>country</td> 
       <td>area</td> 
       <td>website link</td> 
      </tr> 
      <tr> 
       <td>IBM</td> 
       <td>USA</td> 
       <td>EMEA</td> 
       <td><a href="http://www.ibm.com">IBM site</a></td> 
      </tr> 
      <tr> 
      <td>CISCO</td> 
      <td>USA</td> 
      <td>EMEA</td> 
      <td><a href="http://www.cisco.com">cisco site</a></td> 
     </tr> 
      <tr> 
      <td>unknown company</td> 
      <td>USA</td> 
      <td>EMEA</td> 
      <td></td> 
     </tr> 
     </table> 
    </body> 
    </html> 

Мой питон код:

file = open(url,"r") 

    soup = BeautifulSoup(file, 'lxml') 

    parsed_table = soup.find_all('table')[1] 

    df = pd.read_html(str(parsed_table),encoding='utf-8')[0] 

df 

Output (экспорт в CSV):

customer;country;area;website 
IBM;USA;EMEA;IBM site 
CISCO;USA;EMEA;cisco site 
unknown company;USA;EMEA; 

выход ФР ok, но ссылка потеряна. Мне нужно сохранить ссылку. URL по крайней мере.

любая подсказка?

ответ

2

Просто проверьте, если тег существует так:

import numpy as np 

with open(url,"r") as f: 
    sp = bs.BeautifulSoup(f, 'lxml') 
    tb = sp.find_all('table')[56] 
    df = pd.read_html(str(tb),encoding='utf-8', header=0)[0] 
    df['href'] = [np.where(tag.has_attr('href'),tag.get('href'),"no link") for tag in tb.find_all('a')] 
5

pd.read_html принимает данные, которые вас интересуют, в тексте, а не в атрибутах тега. Тем не менее, это не трудно, чтобы очистить таблицу самостоятельно:

import bs4 as bs 
import pandas as pd 

with open(url,"r") as f: 
    soup = bs.BeautifulSoup(f, 'lxml') 
    parsed_table = soup.find_all('table')[1] 
    data = [[td.a['href'] if td.find('a') else 
      ''.join(td.stripped_strings) 
      for td in row.find_all('td')] 
      for row in parsed_table.find_all('tr')] 
    df = pd.DataFrame(data[1:], columns=data[0]) 
    print(df) 

дает

  customer country area   website link 
0    IBM  USA EMEA http://www.ibm.com 
1   CISCO  USA EMEA http://www.cisco.com 
2 unknown company  USA EMEA      
+0

вы можете помочь мне с вопросом У меня с beautifulsoup? – Nobi

+0

@Nobi: Возможно, я не знаю ответа, но если вы опубликуете вопрос, я посмотрю. – unutbu

+0

ладно спасибо, я сделаю сразу – Nobi