【发布时间】:2020-09-04 08:47:42
【问题描述】:
from urllib.request import urlopen
from bs4 import BeautifulSoup
import csv
html = urlopen(
"https://www.accessdata.fda.gov/scripts/drugshortages/default.cfm")
bsObj = BeautifulSoup(html, "lxml")
table = bsObj.find('table', id="cont")
rows = table.findAll("tr")
links = [a['href'] for a in table.find_all('a', href=True) if a.text]
new_links = []
for link in links:
new_links.append(("https://www.accessdata.fda.gov/scripts/drugshortages/"+link).replace(" ", "%20"))
href_rows = []
for link in new_links:
link = link.replace("®", "%C2%AE")
html = urlopen(link)
bsObj_href = BeautifulSoup(html, "lxml")
#bsObj_href = BeautifulSoup (html.decode('utf-8', 'ignore'))
div_href = bsObj_href.find("div",{"id":"accordion"})
href_rows.append(div_href.findAll("tr"))
csvFile = open("drug_shortage.csv", 'wt', newline='')
writer = csv.writer(csvFile)
try:
for row in rows:
csvRow = []
for cell in row.findAll(['td', 'th']):
csvRow.append(cell.get_text())
writer.writerow(csvRow)
finally:
csvFile.close()
你好,所以我创建了两个这样的行。如果你去这个网站https://www.accessdata.fda.gov/scripts/drugshortages/default.cfm 他们有药物名称和状态列,当您单击药物名称时,您可以找到另外四个列。我喜欢按顺序组合在一起(基于药物名称) 所以这将是药物名称、状态、介绍、可用性和估计的短缺持续时间、相关信息、短缺原因(根据 FDASIA)。 但目前的代码只生成第一个(药物名称,状态)。 我试过了
for row in rows,rows_href:
然后我得到 AttributeError: ResultSet object has no attribute 'findAll'。我得到同样的错误
for row in rows_href:
任何建议我如何生成我想要的?
【问题讨论】:
-
如果有任何不清楚的地方需要更多解释,请告诉我!
-
您可能需要
for row, link in zip(rows,rows_href)或者您需要直接在循环中执行 -append( [row, div_href.findAll("tr")] )但它需要工作不那么混乱并使用for row in rows:在每一行中单独搜索链接。跨度> -
其他页面有很多行 - 所以可能你必须用相同的
name, status保存每一行,它需要额外的for循环。它只表明您创建的代码过于混乱,您应该单独处理主页上的每一行。 -
@furas 非常感谢!我还有一个问题,如果我想创建列名(药物名称、状态、演示文稿...),我该怎么做?因为目前第一个药物是列名。我想如果我做 [0:] 或不放任何东西不会跳过标题,但它只会给我索引错误。
标签: python python-3.x csv beautifulsoup