Результат выражения xpath является объектом и должен быть элементом - PullRequest
1 голос
/ 17 марта 2019

Я новичок в очистке веб-сайтов, и я пытался очистить изображения Google с помощью Python (в конечном счете, чтобы создать диск разногласий, но это не имеет значения).Я сделал следующий код, чтобы сохранить изображение src в виде списка, чтобы я мог выбрать индекс и отобразить изображение (я протестировал его с помощью расширения xpath helper chrome, и он возвращает то, что мне нужно):

from selenium import webdriver
from selenium.webdriver.common.by import By
chrome_path =r'C:\Program Files (x86)\Google\Chrome\Application\chrome.exe'
chromedriver_path = r'C:\Users\user\Desktop\chromedriver.exe'
driver = webdriver.Chrome(chromedriver_path)
driver.get("https://www.google.com/search?q=pepega&rlz=1C1GIWA_enGB617GB617&source=lnms&tbm=isch&sa=X&ved=0ahUKEwjH1e6b-YfhAhWRs3EKHeKmAqoQ_AUIDigB&biw=2560&bih=947")

review = driver.find_elements_by_xpath("//div[@jscontroller ='Q7Rsec']/a/img/@src")

print(review)

я получаю следующую ошибку:

Traceback (most recent call last):
  File "C:\Users\user\Desktop\tessst.py", line 8, in <module>
    review = driver.find_elements_by_xpath("//div[@jscontroller ='Q7Rsec']/a/img/@src")
  File "C:\Users\user\AppData\Local\Programs\Python\Python36\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 410, in find_elements_by_xpath
    return self.find_elements(by=By.XPATH, value=xpath)
  File "C:\Users\user\AppData\Local\Programs\Python\Python36\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 1007, in find_elements
    'value': value})['value'] or []
  File "C:\Users\user\AppData\Local\Programs\Python\Python36\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 321, in execute
    self.error_handler.check_response(response)
  File "C:\Users\user\AppData\Local\Programs\Python\Python36\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 242, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.InvalidSelectorException: Message: invalid selector: The result of the xpath expression "//div[@jscontroller ='Q7Rsec']/a/img/@src" is: [object Attr]. It should be an element.
  (Session info: chrome=73.0.3683.75)
  (Driver info: chromedriver=73.0.3683.68 (47787ec04b6e38e22703e856e101e840b65afe72),platform=Windows NT 10.0.17134 x86_64)

Я предполагаю, что это связано с запросом xpath, так как он говорит, что это должен быть "элемент", однако, поскольку я новичок в этом, у меня нетИдея как вернуть изображение SRC как элемент.Может кто-нибудь сказать мне, как исправить мой запрос, чтобы он не отображал ошибку в Python?Спасибо

Редактировать: Я думаю, что я сделал это, что я хочу, я хотел бы сказать спасибо за помощь всем.То, что я сделал, вероятно, примитивно по вашим стандартам, но я не буду делиться этим на тот случай, если это поможет людям:)

окончательный код:

import nltk
from selenium import webdriver
from selenium.webdriver.common.by import By
chrome_path =r'C:\Program Files (x86)\Google\Chrome\Application\chrome.exe'
chromedriver_path = r'C:\Users\user\Desktop\chromedriver.exe'
driver = webdriver.Chrome(chromedriver_path)
driver.get("https://www.google.com/search?q=pepega&rlz=1C1GIWA_enGB617GB617&source=lnms&tbm=isch&sa=X&ved=0ahUKEwjH1e6b-YfhAhWRs3EKHeKmAqoQ_AUIDigB&biw=2560&bih=947")

review = driver.find_elements_by_xpath("//div[@jscontroller ='Q7Rsec']/a/img")

imglist = []

for x in review:
    if x.get_attribute("src") != "":
        temp = str(x.get_attribute("src"))
        if temp[0:8] == "https://":
            imglist.append(str(x.get_attribute("src")))


print(imglist)

Мне пришло в голову, что nltk не используется (Я играл с ним в какой-то момент и забыл удалить его)

Ответы [ 2 ]

0 голосов
/ 17 марта 2019

Вы не можете добавить атрибут src в xpath, который вам не хватает. Однако, что я наблюдаю, некоторые изображения не имеют атрибута src. Вместо этого он имеет атрибут data-src.Ваше решение. Надеюсь, это поможет.

from selenium import webdriver
from selenium.webdriver.common.by import By
chrome_path =r'C:\Program Files (x86)\Google\Chrome\Application\chrome.exe'
chromedriver_path = r'C:\Users\user\Desktop\chromedriver.exe'
driver = webdriver.Chrome(chromedriver_path)
driver.get("https://www.google.com/search?q=pepega&rlz=1C1GIWA_enGB617GB617&source=lnms&tbm=isch&sa=X&ved=0ahUKEwjH1e6b-YfhAhWRs3EKHeKmAqoQ_AUIDigB&biw=2560&bih=947")


reviews = driver.find_elements_by_xpath("//div[@jscontroller ='Q7Rsec']/a/img")

list_review=[]
for review in reviews:
   if review.get_attribute("src") is not None:
        list_review.append(review.get_attribute("src"))
print(list_review)
print(len(list_review))
0 голосов
/ 17 марта 2019

Не бери в голову, я тупой и только сейчас заметил, что твой URL есть в скрипте; Я могу подтвердить, что ваш xpath находит атрибут src вашего элемента img. Следующее должно найти этот элемент и затем получить его атрибут src.

review = driver.find_elements_by_xpath("//div[@jscontroller ='Q7Rsec']/a/img")

Возвращает 100 элементов. Я не уверен, что вы хотите сделать с исходниками, но вот код, который нужно просто напечатать каждый:

for x in review
    if x.get_attribute.src != "":
        print(x.get_attribute(“src”)

При этом должен быть напечатан атрибут src для 55 элементов с указанным src.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...