2015-08-17 3 views
1

Я использовал селен лома сайт прокруткой и дирижировал код нижеСелен найти все элементы с помощью XPath

import requests 
from bs4 import BeautifulSoup 
import csv 
from selenium import webdriver 
from selenium.webdriver.support.ui import WebDriverWait 
import unittest 
from selenium.webdriver.common.by import By 
from selenium.webdriver.support import expected_conditions as EC 
import time 
import unittest 
import re 

output_file = open("Kijubi.csv", "w", newline='') 

class Crawling(unittest.TestCase): 
    def setUp(self): 
     self.driver = webdriver.Firefox() 
     self.driver.set_window_size(1024, 768) 
     self.base_url = "http://www.viatorcom.de/" 
     self.accept_next_alert = True 

    def test_sel(self): 
     driver = self.driver 
     delay = 3 
     driver.get(self.base_url + "de/7132/Seoul/d973-allthingstodo") 
     for i in range(1,1): 
      driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") 
      time.sleep(2) 
    html_source = driver.page_source 
    data = html_source.encode("utf-8") 

Мой следующий шаг должен был ползти конкретную информацию с веб-сайта, как цена.

Таким образом, я добавил следующий код:

all_spans = driver.find_elements_by_xpath("/html/body/div[5]/div/div[3]/div[2]/div[2]/div[1]/div[1]/div") 
    print(all_spans) 
    for price in all_spans: 
     Header = driver.find_elements_by_xpath("/html/body/div[5]/div/div[3]/div[2]/div[2]/div[1]/div[1]/div/div[2]/div[2]/span[2]") 
     for span in Header: 
      print(span.text) 

Но я получаю только одну цену, а не все из них. Не могли бы вы дать мне отзыв о том, что я мог бы улучшить свой код? Спасибо :)

EDIT

Благодаря вашим парням мне удалось получить это работает. Вот дополнительный код:

elements = driver.find_elements_by_xpath("//div[@id='productList']/div/div") 

    innerElements = 15 

    outerElements = len(elements)/innerElements 

    print(innerElements, "\t", outerElements, "\t", len(elements)) 

    for j in range(1, int(outerElements)): 

     for i in range(1, int(innerElements)): 


      headline = driver.find_element_by_xpath("//div[@id='productList']/div["+str(j)+"]/div["+str(i)+"]/div/div[2]/h2/a").text 

      price = driver.find_element_by_xpath("//div[@id='productList']/div["+str(j)+"]/div["+str(i)+"]/div/div[2]/div[2]/span[2]").text 
      deeplink = driver.find_element_by_xpath("//div[@id='productList']/div["+str(j)+"]/div["+str(i)+"]/div/div[2]/h2/a").get_attribute("href") 

      print("Header: " + headline + " | " + "Price: " + price + " | " + "Deeplink: " + deeplink) 

Теперь мой последний вопрос в том, что я до сих пор не получить последние 20 цен назад, которые имеет описание на английском языке. Я только возвращаю цены, которые имеют немецкое описание. Для английских они не получаются, хотя они имеют одну и ту же структуру html.

E.g. html для английских предметов

 headline = driver.find_element_by_xpath("//div[@id='productList']/div[6]/div[1]/div/div[2]/h2/a") 

Вы знаете, что мне нужно изменить? Любая обратная связь приветствуются :)

+0

XPath у вас есть только один элемент ориентации - что XPath был скопирован/генерируется автоматически, поэтому Я бы предложил взглянуть на спецификации и руководства XPath, чтобы вы могли это понять. – Arran

ответ

0

Чтобы захватить все цены на этой странице, вы должны использовать такую ​​XPATH:

Header = driver.find_elements_by_xpath("//span[contains(concat(' ', normalize-space(@class), ' '), 'price-amount')]") 

, что означает: найти все элементы пролетных с классом = цена-суммой, почему настолько сложны - see here

Но проще найти те же элементы, является CSS локатора:

.price-amount 
+0

Спасибо за ваши отзывы –

Смежные вопросы