【发布时间】:2018-05-23 23:07:20
【问题描述】:
我正在尝试为一些配置文件抓取一组页面,并且我构建了一个抓取器,它从一个 csv 文件中迭代一个 url 列表(例如:https://myurl.com)并将它们输入到美丽的灵魂中。然而,soup.find 不返回任何值,尽管只给出一个 URL 时工作。
例如这个 sn-p 工作:
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])
但是,这只会返回 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 都会返回名称。 beautifulSoup 命令的唯一区别是我在第一个也是唯一一个站点中有 page.text,但是 site.text 破坏了循环功能并且不返回任何输出。
我是一个完全的 Python 初学者,但我已经通过解码命令等解决了这个问题,并且每次如果我更改任何内容,循环都会失败。
【问题讨论】:
-
能否给我们您要解析的第二和第三个网址?
-
为了能够提供帮助,我们确实需要查看您尝试抓取的实际 URL。这样我们就可以看到返回的 HTML 并提出修复建议。
标签: python csv beautifulsoup