【发布时间】:2015-03-04 18:43:53
【问题描述】:
这是我之前关于循环浏览多个网页的问题的后续问题。我是编程新手...感谢您的耐心和非常明确的解释!
我已经编写了一个遍历许多网页的循环。在每一页上,我想抓取数据,将其保存到变量或 csv 文件(以更容易/更稳定的为准),然后单击“下一步”按钮,在第二页上抓取数据并将其附加到变量或csv文件等。
具体来说,我的代码如下所示:
url="http://www.url.com"
driver = webdriver.Firefox()
driver.get(url)
(driver.page_source).encode('utf-8')
html = urllib.request.urlopen(url).read()
soup = BeautifulSoup(html)
wait = WebDriverWait(driver, 10)
while True:
# some code to grab the data
job_tag={'class': re.compile("job_title")}
all_jobs=soup.findAll(attrs=job_tag)
jobs=[]
for text in (all_jobs):
t=str(''.join(text.findAll(text=True)).strip())
jobs.append(t)
writer=csv.writer(open('test.csv','a', newline=''))
writer.writerows(jobs)
# click next link
try:
element=wait.until(EC.element_to_be_clickable((By.XPATH, "//*[@id='reviews']/a/span[starts-with(.,'Next')]")))
element.click()
except TimeoutException:
break
它运行没有错误,但是 1)该文件一遍又一遍地收集第一页的数据,而不是后续页面的数据,即使循环执行正确(最终,我并不介意重复条目,但我确实想要来自所有页面的数据)。 我怀疑我需要为每个新页面“重新定义”汤,我正在研究如何让 bs4 访问这些网址。
2) 最后一页没有“下一页”按钮,因此代码不会附加最后一页的数据(当我在 csv 行中使用 'w' 而不是 'a' 时出现该错误,数据为将倒数第二页写入 csv 文件)。
此外,虽然这是一个小问题,但数据在 csv 中每个单元格写入一个字母,即使当我在 Python 中使用 bs4 运行该部分时,数据的格式也正确。我错过了什么?
谢谢!
【问题讨论】:
-
jobs和all_jobs是如何定义的?您可能需要在每次迭代时重置jobs变量以防止重复现有行。 -
@augurar 我编辑了帖子以反映它们的定义方式。谢谢。