2017-01-04 1 views
-2

Hier ist eine URL eines Artikels aus der New York Times: die URL der Kommentar Registerkarte http://www.nytimes.com/2017/01/04/world/asia/china-xinhua-donald-trump-twitter.htmlWie man Daten aus dem Kommentar Tab von einem Online-NYT-Artikel mit Python greifen?

Es hat einen Kommentar Tab enthält, und ich möchte alle Kommentare von der Website zu verwenden BeautifulSoup lib von Python packen mein Ziel erreichen.

Unten ist mein Code. Aber es ergibt ein leeres Ergebnis. Ich denke, es ist ein Problem, dem Computer nicht zu sagen, wo genau der Quelllink zu finden ist. Jeder kann es ändern? Vielen Dank!

import bs4 
import requests 
session = requests.Session() 
url = "http://www.nytimes.com/2017/01/04/world/asia/china-xinhua-donald-trump-twitter.html" 
page = session.get(url).text 
soup = bs4.BeautifulSoup(page) 
comments= soup.find_all(class_='comments-panel') 
for e in comments: 
    print comments.string 
+0

Haben Sie auf der Seite Quelle sehen alle Browser-Entwickler-Tools? Sie sollten in der Lage sein, den Kommentarabschnitt ziemlich leicht zu finden. – MattDMo

+0

willst du nicht 'class _ = 'comments-view')' oder tab-content? – depperm

+0

Ich würde empfehlen, einen Browser-Emulator zu versuchen, überprüfen Sie [Selen '] (http://www.seleniumhq.org) – eLRuLL

Antwort

1

Der Kommentar Tab mit allen Kommentaren ist ausgeblendet und wird über ein Javascript-Ereignis angezeigt. Wie von @eLRuLL empfohlen könnten Sie Selen öffnen Sie die Registerkarte Kommentar verwenden und die Kommentare wie diese (hier in Python 3) abrufen:

import time 
from bs4 import BeautifulSoup 
from selenium import webdriver 

driver = webdriver.firefox.webdriver.WebDriver(executable_path='.../geckodriver') # adapt the path to the geckodriver 

# set the browser window size to desktop view 
driver.set_window_size(2024, 1000) 

url = "http://www.nytimes.com/2017/01/04/world/asia/china-xinhua-donald-trump-twitter.html" 
driver.get(url) 

# waiting for the page is fully loaded 
time.sleep(5) 

# select the link 'SEE ALL COMMENTS' and click it 
elem = driver.find_element_by_css_selector('li.comment-count').click() 

# get source code and close the browser 
page = driver.page_source 
driver.close() 

soup = BeautifulSoup(page) 

comments = soup.find_all('div', class_='comments-panel') 
print(comments[0].prettify()) 

EDIT:

Um alle Kommentare abrufen und alle Antworten auf die Kommentare , müssen Sie 1) die Elemente "READ MORE" und "SEE ALL REPLIES" (2) auswählen, um zu iterieren und auf sie zu klicken. Ich habe dementsprechend mein Codebeispiel geändert:

import time 
from bs4 import BeautifulSoup 
from selenium import webdriver, common 

driver = webdriver.firefox.webdriver.WebDriver(executable_path='.../geckodriver') # adapt the path to the geckodriver 

# set the browser window size to desktop view 
driver.set_window_size(2024, 1000) 

url = 'http://www.nytimes.com/2017/01/04/world/asia/china-xinhua-donald-trump-twitter.html' 
driver.get(url) 

# waiting for the page is fully loaded 
time.sleep(5) 

# select the link 'SEE ALL COMMENTS' and READ MORE and click them 
elem = driver.find_element_by_css_selector('button.button.comments-button.theme-speech-bubble').click() 
while True: 
    try: 
     driver.find_element_by_css_selector('div.comments-expand.comments-thread-expand').click() 
     time.sleep(3) 
    except common.exceptions.ElementNotVisibleException: 
     break 

# select the links SEE ALL REPLIES and click them 
replies = driver.find_elements_by_css_selector('div.comments-expand.comments-subthread-expand') 
for reply in replies: 
    reply.click() 
    time.sleep(3) 

# get source code and close the browser 
page = driver.page_source 
driver.close() 

soup = BeautifulSoup(page, 'html.parser') 

comments = soup.find_all('div', class_='comments-panel') 
print(comments[0].prettify()) 
+0

Danke Benjamin - Sehr schlaue Lösung und ich modifiziere ein bisschen und es kratzen die Kommentare, aber nicht alle. Es gibt versteckte Kommentare, außer wir klicken auf "Mehr lesen". – user7246029

+1

Eine effizientere Alternative zum Scraping wäre vielleicht die Nutzung der NYTimes [API] (http://developer.nytimes.com/), die Zugriff auf Kommentare registrierter Benutzer bietet: http://developer.nytimes.com/ community_api_v3.json #/Documentation/GET/user-content/url.json – Benjamin

+0

Benjamin: Ich sehe, dass Sie ein tiefes Verständnis von HTML, CSS und JAVASCRIPT haben. 2 weitere Fragen: (1) Fehler tritt auf, wenn ich Ihren Code ausführen, der als "selen.common.exceptions.WebDriverException: Nachricht: unbekannter Fehler: Element ist nicht anklickbar (728, 817) (Session info: chrome = 55.0.2883.87) (Treiberinfo: chromedriver = 2.25.426923 (0390b88869384d6eb0d5d09729679f934aab9eed), Plattform = Windows NT 6.1.7601 SP1 x86_64) "(2) für die css-Selektorteile, wie haben Sie die" button.button.commations- button.theme-rede-bubble '' Tut mir leid, ich habe wenig Erfahrung mit Web-Programmierung. – user7246029

Verwandte Themen