写'功能输出'成为一个很好的熊猫数据帧

时间:2018-01-08 15:03:51

标签: python python-2.7 pandas dataframe beautifulsoup

我曾经和spark一起工作,他设法自动构建漂亮的桌子。 现在我用python和美丽的汤来摄取药物数据。 这是我的代码,我想建立一个包含所有药物及其相关信息的表格。

我尝试使用" split"因为这些信息与" ---"

但没有得到可读的东西: 请在下面找到代码+结果样本+理想DataFrame的结构

1-代码

import requests
from bs4 import BeautifulSoup

def get_details(url):
   print('details:', url)

   # get subpage
   r = requests.get(url)
   soup = BeautifulSoup(r.text ,"lxml")

   # get data on subpabe
   dts = soup.findAll('dt')
   dds = soup.findAll('dd')

   # display details
    for dt, dd in zip(dts, dds):
        print(dt.text)
        print(dd.text)
        print('---')

        print('---------------------------')

def drug_data():
    url = 'https://www.drugbank.ca/drugs/'

    while url:
         print(url)
         r = requests.get(url)
         soup = BeautifulSoup(r.text ,"lxml")

         # get links to subpages
         links = soup.select('strong a')
         for link in links:
             # exeecute function to get subpage
             get_details('https://www.drugbank.ca' + link['href'])

        # next page url
         url = soup.findAll('a', {'class': 'page-link', 'rel': 'next'})
         print(url)
         if url:
            url = 'https://www.drugbank.ca' + url[0].get('href')
         else:
            break

2 - 输出结构如下:

名称

5-甲基四氢叶酸

入藏号

DB04789

类型

小分子

批准,营养保健品

描述 5-甲基四氢叶酸是四氢叶酸的甲基化衍生物。它由5,10-亚甲基四氢叶酸的亚甲基四氢叶酸还原酶产生,用于通过5-甲基四氢叶酸 - 高半胱氨酸甲基转移酶(也称甲硫氨酸合酶)将高半胱氨酸再循环回蛋氨酸。

Panda Dataframe应如下所示:

this

你有什么建议? 最好

2 个答案:

答案 0 :(得分:0)

要实现我们的目标,有一些事情要做。首先,您必须将解析后的HTML文件转换为Pandas Dataframes。为此,您可以使用Pandas read_html函数。然后,您必须将每个生成的Pandas Dataframe合并到一个Dataframe中。 要设置输出样式,您可以使用Pandas显示相关选项,因为这取决于您的系统我只是在脚本顶部放置了三个可能的选项。请随时咨询Pandas options以进一步配置。

### Load the pandas library
import pandas as pd

### Set Pandas settings

# Set max number of displayed columns
pd.set_option('display.max_columns', 100)

# Set max column width
pd.set_option('display.max_colwidth', 1000)

# Prevent pandas linebreak
pd.set_option('display.expand_frame_repr', False)

import requests
from bs4 import BeautifulSoup

def get_details(url):
    print('details:', url)

    # get subpage
    r = requests.get(url)
    soup = BeautifulSoup(r.text ,"lxml")

    ### Convert the soup object to string 
    #   than you can parse it directly with pandas
    #   this returns a list of dfs therefore, fetch the first list item
    #   return the df to merge it later with the other results
    return pd.read_html(str(soup))[0]


def drug_data():
    url = 'https://www.drugbank.ca/drugs/'

    ### Helper list to store the single drugs Pandas Dataframes
    listOfDrugDfs = []

    while url:

        print(url)
        r = requests.get(url)
        soup = BeautifulSoup(r.text ,"lxml")

        # get links to subpages
        links = soup.select('strong a')
        for link in links:

            # exeecute function to get subpage
            ### Extended to append results of function to listOfDrugDfs
            listOfDrugDfs.append(get_details('https://www.drugbank.ca' + link['href']))

        # next page url
        url = soup.findAll('a', {'class': 'page-link', 'rel': 'next'})
        print(url)
        if url:
            url = 'https://www.drugbank.ca' + url[0].get('href')
        else:
            break

    ### Merge single results dfs to one big results dataframe
    resultDf = pd.concat(listOfDrugDfs)

    ### Print results
    print(resultDf)

    ### Or return
    #return resultDf

答案 1 :(得分:0)

如果您希望对现有代码进行最简单的扩展,只为DataFrame选择几列,可以使用以下内容作为起点:

git stash

(注意,您网址中的数据存在问题,例如,您可以获得多次点击。'说明')无论如何,希望这可能有所帮助。