Как мне соскобить JSP с Python, Selenium и BeautifulSoup? - PullRequest
0 голосов
/ 07 января 2020

Я абсолютный новичок, экспериментирующий с веб-скребком Python. Я пытаюсь извлечь местоположение банкоматов из этого URL:

https://www.visa.com/atmlocator/mobile/index.jsp#(page:results,params:(query:'Tokyo,%20Japan'))

, используя следующий код.

#Script to scrape locations and addresses from VISA's ATM locator


# import the necessary libraries (to be installed if not available):

from selenium import webdriver
from bs4 import BeautifulSoup
import pandas as pd


#ChromeDriver
#(see https://chromedriver.chromium.org/getting-started as reference)

driver = webdriver.Chrome("C:/Users/DefaultUser/Local Settings/Application Data/Google/Chrome/Application/chromedriver.exe")

offices=[] #List to branches/ATM names
addresses=[] #List to branches/ATM locations
driver.get("https://www.visa.com/atmlocator/mobile/index.jsp#(page:results,params:(query:'Tokyo,%20Japan'))") 


content = driver.page_source
soup = BeautifulSoup(content, features = "lxml")


#the following code extracts all the content inside the tags displaying the information requested

for a in soup.findAll('li',attrs={'class':'visaATMResultListItem'}): 
    name=a.find('li', attrs={'class':'data-label'}) 
    address=a.find('li', attrs={'class':'data-label'}) 
    offices.append(name.text)
    addresses.append(address.text)


#next row defines the dataframe with the results of the extraction

df = pd.DataFrame({'Office':offices,'Address':addresses})


#next row displays dataframe content

print(df)


#export data to .CSV file named 'branches.csv'
with open('branches.csv', 'a') as f:
    df.to_csv(f, header=True)

Сценарий, кажется, работает правильно, сначала, поскольку Chromedriver запускается и отображает результаты, как требуется в браузере, но результат не возвращается:

Empty DataFrame
Columns: [Office, Address]
Index: []
Process finished with exit code 0

Может быть, я ошибся в выборе селекторов?

Спасибо большое много за вашу помощь

Ответы [ 2 ]

1 голос
/ 07 января 2020

Проблема с локаторами, используйте

for a in soup.findAll('li',attrs={'class':'visaATMResultListItem'}): 
    name = a.find('p', attrs={'class':'visaATMPlaceName '}) 
    address = a.find('p', attrs={'class':'visaATMAddress'}) 
    offices.append(name.text)
    addresses.append(address.text)
0 голосов
/ 07 января 2020
from selenium import webdriver
from selenium.webdriver.firefox.options import Options
import time
from bs4 import BeautifulSoup
import csv

options = Options()
options.add_argument('--headless')

driver = webdriver.Firefox(options=options)
driver.get("https://www.visa.com/atmlocator/mobile/index.jsp#(page:results,params:(query:'Tokyo,%20JAPAN'))")
time.sleep(2)

soup = BeautifulSoup(driver.page_source, 'html.parser')

na = []
addr = []
for name in soup.findAll("a", {'class': 'visaATMPlaceLink'}):
    na.append(name.text)
for add in soup.findAll("p", {'class': 'visaATMAddress'}):
    addr.append(add.get_text(strip=True, separator=" "))

with open('out.csv', 'w', newline="") as f:
    writer = csv.writer(f)
    writer.writerow(['Name', 'Address'])
    for _na, _addr in zip(na, addr):
        writer.writerow([_na, _addr])

driver.quit()

Вывод: Click-Here

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