python - 如何使用 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 ```
解决方案
您需要在代码中更正一些事情。
out
变量缩进不正确。应在响应对象上检查状态代码,即
out
不是soup
。您不需要第二个循环,因为每个响应仅包含您已经在
script_data
变量中收集的单个 pubchem ID。最后,您可以使用 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')
推荐阅读
- java - 如何从 Java 中读取 proto3 自定义选项
- java - 宾果游戏 Java
- android - Xamarin 应用无法识别任何蓝牙设备 (Plugin.BluetoothLE)
- node.js - 在没有密码提示的情况下运行 sudo 命令
- java - 移动 3 个对象但保持对齐的公共方法
- android - 屏幕关闭时如何保持相机预览打开?
- java - 配置应用程序以 log4j2 故障登录 ActiveMQ
- sql - 检查 varchar 列是否只有字母字符
- rabbitmq - Airflow Worker - KeyError: u'No such transport: ampq
- php - PHP - Behat - 页面对象扩展 - 致命错误:未捕获的 ArgumentCountError:函数 FeatureContext::__construct() 的参数太少