首页 > 解决方案 > 如何使用 python 网络抓取从列表中提取每个输入的 html 文本输出作为列表。我已经编写了代码,但只给出了第一个条目输出

问题描述

我是 python 和编程的新手。我正在尝试从名为 IMPAAT(https://cb.imsc.res.in/imppat/home)的数据库中提取 pubchem ID。我有一个草药数据库中的化学 ID 列表,其中进入每个化学 ID 超链接会提供有关其 pubchem ID 和微笑数据的详细信息。

我在 python 中编写了一个脚本,将每个化学 ID 作为输入,并从 html 页面中查找 pubchem ID,并使用 API Web抓取方法将输出打印到文本文件。

我发现很难将所有数据作为输出。很确定 for 循环中存在一些错误,因为它多次打印第一个输出,而不是每个输入的不同输出。

请帮助解决这个问题。

另外,我不知道如何保存这种文件并排打印输入和相应的输出。请帮忙。

import requests
import xmltodict
from pprint import pprint
import time
from bs4 import BeautifulSoup
import json
import pandas as pd
import os
from pathlib import Path
from tqdm.notebook import tqdm

cids = 'output.txt'

df = pd.read_csv(cids, sep='\t')
df

data = []

for line in df.iterrows():
    
out = requests.get(f'https://cb.imsc.res.in/imppat/Phytochemical-detailedpage-auth/CID%{line}')
    
    soup = BeautifulSoup(out.text, "html.parser")
    
    if soup.status_code == 200:
        script_data = soup.find('div', {'class': 'views-field views-field-Pubchem-id'}).find('span', {'class': 'field-content'}).find('h3')
    #print(script_data.text)
    
    for text in script_data:
        
        texts = script_data.get_text()
        
        print(text)
    
    data.append(text)
   
    
print(data)
    

****
input file consists of 

cids
0   3A155934
1   3A117235
2   3A12312921
3   3A12303662
4   3A225688
5   3A440966
6   3A443160 ```

标签: pythonweb

解决方案


您需要在代码中更正一些事情。

  1. out变量缩进不正确。

  2. 应在响应对象上检查状态代码,即out不是soup

  3. 您不需要第二个循环,因为每个响应仅包含您已经在script_data变量中收集的单个 pubchem ID。

  4. 最后,您可以使用 pandas 将每个化学 ID 与其 pubchem ID 相关联,然后可以写入 CSV 文件。

有关完整结果,请参阅下面的代码。

代码

import requests
import xmltodict
from pprint import pprint
import time
from bs4 import BeautifulSoup
import json
import pandas as pd
import os
from pathlib import Path
from tqdm.notebook import tqdm

cids = 'output.txt'

df = pd.read_csv(cids, sep='\t')

pubchem_id= []

for line in df.iterrows():
    
    out = requests.get(f'https://cb.imsc.res.in/imppat/Phytochemical-detailedpage-auth/CID%{line}')

    if out.status_code == 200:
        
        soup = BeautifulSoup(out.text, "html.parser")

        script_data = soup.find('div', {'class': 'views-field views-field-Pubchem-id'}).find('span', {'class': 'field-content'}).find('h3').getText()
    
        script_data = script_data.replace('PubChem Identifier:','')
        
        pubchem_id.append(script_data)

# As you have not mentioned column index of cids, I am assuming it should be the first column
df1 = pd.DataFrame({"chemical_id": df.iloc[:, 0].tolist(), "pubchem_id": pubchem_id})
    
print(df1)

# uncomment below line to write the dataframe into csv files & replace 'filename' by the complete filepath
# df1.to_csv('filename.csv')

推荐阅读