我正在尝试为一些配置文件刮取一组页面,并且我构建了一个刮刀,它从csv文件中迭代一个URL列表(例如:https://myurl.com)并将它们输入到美丽的灵魂中。但是,尽管只给出了一个URL,但是soup.find不返回任何值。
例如,此代码段有效:
page = requests.get('www.myurl.org')
soup = BeautifulSoup(page.text, 'html.parser')
name = soup.title.string
specialty = soup.find('p', attrs={'id':"content_element_0_main_column_0_ctl09_Spec"})
birthdate = soup.find('p', attrs={'id' : "content_element_0_main_column_0_ctl17_Birth"})
gender = soup.find('p', attrs={'id':"content_element_0_main_column_0_ctl17_Gender"})
email = soup.find('p', attrs={'id':"content_element_0_main_column_0_ctl09_Web"})
f.writerow([name, specialty, birthdate, gender, email])
然而,这只返回字段" name"在csv中,没有后续的:
with open('linklistshort.csv') as inf:
urls = (line.strip() for line in inf)
for url in urls:
print(url)
site = urlopen(url).read()
soup = BeautifulSoup(site, 'html.parser')
name = soup.title.string
specialty = soup.find('p', attrs={'id' :"content_element_0_main_column_0_ctl09_Spec"})
birthdate = soup.find('p', attrs={'id' : "content_element_0_main_column_0_ctl17_Birth"})
gender = soup.find('p', attrs={'id':"content_element_0_main_column_0_ctl17_Gender"})
email = soup.find('p', attrs={'id':"content_element_0_main_column_0_ctl09_Web"})
f.writerow([name, specialty, birthdate, gender, email])
结果应该是一个包含五列的csv文件,每列包含正确的数据 - 这是我从第一个代码块获得的,用于输入的单个URL。
然而,实际输出返回五列,第一列填充"名称"字段和其他空白。很明显,循环访问URL是有效的,因为每个URL都返回name。 beautifulSoup命令的唯一区别是我在第一个和唯一的站点中有page.text,但是site.text打破了循环功能并且不返回任何输出。
我是一个完整的python初学者,但我通过解码命令等来解决这个问题,每次循环失败时如果我改变了什么。
答案 0 :(得分:0)
您正在通过csv writerow函数传递BeautifulSoup对象,请将所有汤对象更改为如下文本:
page = requests.get('www.myurl.org')
soup = BeautifulSoup(page.text, 'html.parser')
name = soup.title.string
specialty = soup.find('p', attrs={'id':"content_element_0_main_column_0_ctl09_Spec"}).text
birthdate = soup.find('p', attrs={'id' : "content_element_0_main_column_0_ctl17_Birth"}).text
gender = soup.find('p', attrs={'id':"content_element_0_main_column_0_ctl17_Gender"}).text
email = soup.find('p', attrs={'id':"content_element_0_main_column_0_ctl09_Web"}).text
f.writerow([name, specialty, birthdate, gender, email])