Webscraping - не отображать текстовую часть HTML-кода - PullRequest
0 голосов
/ 23 октября 2018

У меня проблема, когда я пытаюсь создать веб-сайт, используя библиотеку Selenium через python.Дело в том, что я хочу получить некоторую информацию о песнях, собранных на этом сайте: https://bandcamp.com/?g=all&s=top&p=0&gn=0&f=all&w=0.

Однако, когда я пытаюсь извлечь текст из соответствующего HTML-кода, процесс возвращает пустой список.

Если я посмотрю HTML-код из моего браузера (Chrome), я увижу текстовую часть, но когда я посмотрю на тот же код в Python, текстовая часть не появится.

Вот мой код:

browser = webdriver.Chrome()
browser.get("https://bandcamp.com/?g=all&s=top&p=0&gn=0&f=all&w=0")

name_song = browser.find_elements_by_css_selector("a.item-title")
name_artist = browser.find_elements_by_css_selector("a.item-artist")

genre = browser.find_elements_by_class_name("item-genre")
print(name_song, name artist, genre)

Когда я печатаю три переменные, я получаю HTML-код, но я ничего не могу извлечь из него.Как я могу решить эту проблему?Заранее большое спасибо за вашу помощь.

Моя цель - получить "Апокалипсистов", "Kriegsmachine" и "metal", каждому из которых присваивается одна переменная.

That's the webpage of the site and the corresponding html code

Ответы [ 3 ]

0 голосов
/ 23 октября 2018

Вы были так близко.Вам просто нужно вызвать WebDriverWait , чтобы желаемые элементы были видны , и сохранить WebElements в трех различных списках и выполнить итерацию по ним длянапечатайте нужный текст, и вы можете использовать следующее решение:

  • Кодовый блок:

    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
    
    options = webdriver.ChromeOptions() 
    options.add_argument("start-maximized")
    options.add_argument('disable-infobars')
    browser = webdriver.Chrome(chrome_options=options, executable_path=r'C:\WebDrivers\chromedriver.exe')
    browser.get("https://bandcamp.com/?g=all&s=top&p=0&gn=0&f=all&w=0")
    name_song = WebDriverWait(browser, 20).until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR, "a.item-title")))
    name_artist = WebDriverWait(browser, 20).until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR,"a.item-artist")))
    genre = WebDriverWait(browser, 20).until(EC.visibility_of_all_elements_located((By.XPATH,"//a[@class='item-artist']//following::span[1]")))
    for song, artist, gen in zip(name_song, name_artist, genre):
        print("%s song is by %s and is of %s genre" % (song.text, artist.text, gen.text))
    
  • Консольный вывод:

    Apocalypticists song is by Kriegsmaschine and is of metal genre
    The Path song is by Carbon Based Lifeforms and is of ambient genre
    Christmas Time Is Here (N & S America Edition) song is by Khruangbin and is of funk genre
    Christmas Time Is Here (Excluding N & S America) song is by Khruangbin and is of funk genre
    Snailchan Adventure song is by Ujico*/Snail's House and is of electronic genre
    O God who avenges, shine forth. Rise up, Judge of the Earth; pay back to the proud what they deserve. song is by the body and is of metal genre
    T-Rex EP song is by Ben Prunty and is of soundtrack genre
    Woodland Womp (24bit 96kHz) song is by Kalya Scintilla and is of electronic genre
    
0 голосов
/ 23 октября 2018

Объект Element не будет давать значение innerText.Вам нужно вызвать element.text, чтобы получить его.browser.find_elements_by_class_name("item-genre") возвращает 23 элемента.локатор также должен быть изменен, чтобы получить соответствующий 8 элемент.

browser = webdriver.Chrome()
browser.get("https://bandcamp.com/?g=all&s=top&p=0&gn=0&f=all&w=0")

name_song = browser.find_elements_by_css_selector("a.item-title")
name_artist = browser.find_elements_by_css_selector("a.item-artist")
genre = browser.find_elements_by_css_selector("span.item-genre")

for i in range(len(name_song)-1):
  print(name_song[i].text)
  print(name_artist[i].text)
  print(genre[i].text)
0 голосов
/ 23 октября 2018

Вам просто нужно войти в каждый элемент, чтобы получить то, что вы хотите.Ваш код выше возвращает три списка объектов селена.У каждого объекта есть атрибуты, к которым вы можете получить доступ, и один из этих атрибутов: .text

Если я запусту приведенный выше код, я смогу получить доступ к name_song:

[<selenium.webdriver.remote.webelement.WebElement (session="83853054732fa0a5bfbc8a7e32a1e05b", element="0.4629143928625561-1")>,...

Но,если я хочу получить только текст из этих элементов, я могу вызвать атрибут text каждого из них:

[i.text for i in name_song]

['Apocalypticists',
 'The Path',
 'Christmas Time Is Here (N & S America Edition)',
 'Christmas Time Is Here (Excluding N & S America)',
 'Snailchan Adventure',
 'O God who avenges, shine forth. Rise up, Judge of the Earth; pay back to the proud what they deserve.',
 'T-Rex EP',
 'Woodland Womp (24bit 96kHz)']

Затем выполнить индексацию в этом списке:

[i.text for i in name_song]
'Apocalypticists'
...