2015-02-24 2 views
1

я пытался использовать селен, чтобы очистить названия статей на этом сайте: http://www.ncbi.nlm.nih.gov/pubmed?term=(%222013%22%5BDate%20-%20Publication%5D%20%3A%20%222013%22%5BDate%20-%20Publication%5D)получить питон UnicodeEncodeError, когда я использовал селен ползать веб-сайт

#coding="utf-8" 

from selenium import webdriver 
from selenium.webdriver.common.keys import Keys 
import time 

domain = "http://www.ncbi.nlm.nih.gov/" 
url_tail = "pubmed?term=(%222013%22%5BDate%20-%20Publication%5D%20%3A%20%222013%22%5BDate%20-%20Publication%5D)" 
url = domain + url_tail 

browser = webdriver.Firefox() 
browser.get(url) 
time.sleep(5) 

def extract_data(browser): 
    titles = browser.find_elements_by_css_selector("div.rprt div.rslt p.title a") 
    return [title.text for title in titles] 

page_start = 1 
page_end = 10 

f = open('titles.txt', 'a') 
for page in range(page_start, page_end): 
    print "page %d" % page 
    page_jump_box = browser.find_element_by_class_name("num").clear() 
    page_jump_box_cleared = browser.find_element_by_class_name("num") 
    page_jump_box_cleared.send_keys(str(page) + Keys.RETURN) 

    time.sleep(15) 

    f = open('titles.txt', 'a') 
    for line in extract_data(browser): 
     f.write(line + '\n') 

f.close() 

, когда я запускаю его, я получил это:

Когда я искал в Stackoverflow, я нашел аналогичный вопрос: UnicodeEncodeError: 'ascii' codec can't encode character u'\xa0' in position 20: ordinal not in range(128). Я узнал, что когда вы используете str(), это вызовет проблему unicode. Но в моем коде я использую только str(), чтобы сделать число page строкой. Итак, как исправить код.

А вот еще один question.I've узнал, что если я хочу использовать phantomjs с селеном, мне нужно только изменить browser = webdriver.Firefox() в browser = webdriver.PhantomJS(), но когда я это сделать, содержание, что я соскобленные повторяются (только титулы страницы 1 были очищены).

Я не являюсь носителем английского языка, если есть какая-либо ошибка в грамматике или какая-либо ошибка, пожалуйста, дайте мне знать.

благодарит заранее.

ответ

2

Вы должны encode строку перед записью в файл:

for line in extract_data(browser): 
    f.write(line.encode('utf-8') + '\n') 

Что касается вашего второго вопроса, я предлагаю следующие улучшения (что бы сделать его работу):

  • использование Explicit Waits вместо time.sleep() звонков - это также значительно улучшит производительность
  • вместо ввода номера страницы, кнопку «Далее»
  • нажмите открыть файл в «добавить» режим перед циклом и использовать with context manager
  • close() браузер после того как вы сделали

Код:

from selenium import webdriver 
from selenium.webdriver.common.by import By 
from selenium.webdriver.support.ui import WebDriverWait 
from selenium.webdriver.support import expected_conditions as EC 

domain = "http://www.ncbi.nlm.nih.gov/" 
url_tail = "pubmed?term=(%222013%22%5BDate%20-%20Publication%5D%20%3A%20%222013%22%5BDate%20-%20Publication%5D)" 
url = domain + url_tail 

browser = webdriver.PhantomJS() 
browser.get(url) 


def extract_data(browser): 
    titles = browser.find_elements_by_css_selector("div.rprt div.rslt p.title a") 
    return [title.text for title in titles] 


page_start, page_end = 1, 10 

with open('titles.txt', 'a') as f: 
    for page in range(page_start, page_end): 
     WebDriverWait(browser, 10).until(
      EC.presence_of_element_located((By.CSS_SELECTOR, "div.rprt p.title")) 
     ) 

     for line in extract_data(browser): 
      f.write(line.encode('utf-8') + '\n') 

     print "page %d" % page 

     browser.find_element_by_css_selector("div.pagination a.next").click() 

browser.close() 

Это производит titles.txt с названиями из страниц результата 1-9:

Robotic-assisted tubal anastomosis with one-stitch technique. 
Effectiveness of pictorial health warnings on cigarette packs among Lebanese school and university students. 
... 
Importance and globalization status of good manufacturing practice (GMP) requirements for pharmaceutical excipients. 
Systemic review on drug related hospital admissions - A pubmed based search. 
+0

Thanks.It works.But, когда я изменяю 'browser = webdriver.Firefox()' в 'browser = webdriver.PhantomJS()', он все еще царапает повторяющееся содержимое. Вы знаете, почему? –

+0

@TongfeiGao Хорошо, хорошо, это отдельная проблема, позвольте мне взглянуть. – alecxe

+0

@TongfeiGao см. Обновление (работает для меня). – alecxe