python web抓取(如果使用所有标量值,则必须传递索引)

Posted

技术标签:

【中文标题】python web抓取(如果使用所有标量值,则必须传递索引)【英文标题】:python web scraping (If using all scalar values, you must pass an index) 【发布时间】:2020-03-19 08:43:00 【问题描述】:

我正在尝试使用 python 进行网络抓取。当我尝试创建一个数据框来存储带有提取信息的变量时,它显示“ValueError:如果使用所有标量值,则必须传递一个索引”。我已经通过尝试索引'trade_name':trade_name, index=[0])查看了本网站的其他相关帖子,但仍然无法解决。请帮忙。

import pandas as pd
import requests
import urllib.request
import time
from bs4 import BeautifulSoup

url = 'https://www.medindia.net/doctors/drug_information/abacavir.htm'
response = requests.get(url)
soup = BeautifulSoup(response.text, "html.parser")
drug = soup.find(class_='mi-container__fluid')
print(drug)

# whole page contain drug content
items = drug.find_all(class_='report-content drug-widget')
print(items)

# extract drug information from drug content into individual variable
trade_name = print(items[0].find(class_='drug-content').get_text())
function = print(items[1].find(class_='drug-content').get_text())
Contraindications = print(items[2].find(class_='drug-content').get_text())
Dosage = print(items[3].find(class_='drug-content').get_text())
how_to_use = print(items[4].find(class_='drug-content').get_text())
warnings = print(items[5].find(class_='drug-content').get_text())
storage = print(items[7].find(class_='drug-content').get_text())


drug_stuff = pd.DataFrame(
        
                'trade_name':trade_name,
                'function': function,
                'Contraindications': Contraindications,
                'Dosage': Dosage,
                'how_to_use':how_to_use,
                'warnings':warnings,
                'storage':storage,
                
        )


print(drug_stuff)

【问题讨论】:

print() 总是返回 None - 所以 trade_name = print( ...)trade_name = None 一样工作。删除print() 以将值分配给变量trade_name = items[0].find(class_='drug-content').get_text() 我已经完成了删除打印,但在尝试使用变量创建数据框时仍然显示相同的错误。 要创建DataFrame,你必须使用带有元素的列表——即使你只有一个元素——'trade_name': [trade_name], ..., 'storage': [storage],——然后它会在没有警告的情况下工作 谢谢。那解决了我的问题。现在我需要知道如何清除数据中的换行符。 也许是get_text(strip=True)。最终text = text.replace("\n", "") 【参考方案1】:

首先:print() 总是返回 None - 所以 trade_name = print(...)trade_name = None 一样工作,你什么也得不到。删除print() 为变量赋值

 trade_name = items[0].find(class_='drug-content').get_text()

要创建DataFrame,您必须使用带有元素的列表 - 即使您只有一个元素 -

'trade_name': [trade_name], ..., 'storage': [storage],

然后它会在没有警告的情况下工作。

如果您不使用[],那么它可能会将trade_namestorage 中的字符串视为字符列表,并将每个字符放在单独的行中。因为字符串有不同数量的字符,所以它们会创建不同数量的行,这可能会产生问题并显示警告。


顺便说一句:您可以使用get_text(strip=True) 删除一些无用的空格、制表符、文本输入。


import pandas as pd
import requests
import urllib.request
import time
from bs4 import BeautifulSoup

url = 'https://www.medindia.net/doctors/drug_information/abacavir.htm'
response = requests.get(url)
soup = BeautifulSoup(response.text, "html.parser")
drug = soup.find(class_='mi-container__fluid')
#print(drug)

# whole page contain drug content
items = drug.find_all(class_='report-content drug-widget')
#print(items)

# extract drug information from drug content into individual variable
trade_name = items[0].find(class_='drug-content').get_text(strip=True)
function = items[1].find(class_='drug-content').get_text(strip=True)
contraindications = items[2].find(class_='drug-content').get_text(strip=True)
dosage = items[3].find(class_='drug-content').get_text(strip=True)
how_to_use = items[4].find(class_='drug-content').get_text(strip=True)
warnings = items[5].find(class_='drug-content').get_text(strip=True)
storage = items[7].find(class_='drug-content').get_text(strip=True)


drug_stuff = pd.DataFrame(
    'trade_name': [trade_name],
    'function': [function],
    'contraindications': [contraindications],
    'dosage': [dosage],
    'how_to_use': [how_to_use],
    'warnings': [warnings],
    'storage': [storage],
)

print(drug_stuff)

【讨论】:

以上是关于python web抓取(如果使用所有标量值,则必须传递索引)的主要内容,如果未能解决你的问题,请参考以下文章

如何解决“如果使用所有标量值,则必须传递索引”问题 pandas

字典到数据框错误:“如果使用所有标量值,则必须传递索引”

出现错误:“ValueError:如果使用所有标量值,则必须传递索引”将 ndarray 转换为 pandas Dataframe

从变量中的值构造 pandas DataFrame 会给出“ValueError:如果使用所有标量值,则必须传递一个索引”

抓取当前股票价格并创建数据框

三.protobuf3标量值类型