1. ホーム
  2. python

[解決済み] テーブルからフィールド名でデータを抽出する。Xpath、パイソン

2022-03-03 01:54:55

質問

このページからデータを抽出したい https://mbasic.facebook.com/kristina.layus 2つの行を持つテーブル(quot;Places lived")があります。

Current city --- Moscow, Russia
Home town    --- Saint Petersburg, Russia

私は完全なxpathの助けを借りてデータを抽出することができます(抽出されたデータ "モスクワ、ロシア" )。

/html/body/div/div/div[2]/div/div[1]/div[4]/div/div/div[1]/div/table/tbody/tr/td[2]/div/a

しかし、私はテーブル内の名前の助けを借りてデータを抽出したい。私はこれを試してみました

//div[@id='living']//div[@title='Current City']//a/text()

しかし、エラーが発生した

NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"//div[@id='living']//div[@title='Current City']//a/text()"}
  (Session info: chrome=84.0.4147.89)

私のコード

from selenium import webdriver
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

class FacebookParser:
    LOGIN_URL = 'https://www.facebook.com/login.php'

    def __init__(self, login, password):
        chrome_options = webdriver.ChromeOptions()
        prefs = {"profile.default_content_setting_values.notifications": 2}
        chrome_options.add_experimental_option("prefs", prefs)

        self.driver = webdriver.Chrome(chrome_options=chrome_options)
        self.wait = WebDriverWait(self.driver, 10)
        self.login(login, password)

    def login(self, login, password):
        self.driver.get(self.LOGIN_URL)

        # wait for the login page to load
        self.wait.until(EC.visibility_of_element_located((By.ID, "email")))

        self.driver.find_element_by_id('email').send_keys(login)
        self.driver.find_element_by_id('pass').send_keys(password)
        self.driver.find_element_by_id('loginbutton').click()
    
    def get_user_by_id(self, id):
        self.driver.get(BASIC_URL + 'profile.php?id=' + str(id))
        
    def get_user_by_url(self, url):
        self.driver.get(url)
    
    def find_element_by_xpath_safe(self, path):
        try:
            return parser.driver.find_element_by_xpath(path)
        except:
            return None

    def get_first_name(self):
        res = self.find_element_by_xpath_safe('//span/div/span/strong')
        if res:
            vec = res.text.split()
            if len(vec) > 0:
                return vec[0]
            else:
                print("Can't split {}".format(res.text))
        return ""

    def get_second_name(self):
        res = self.find_element_by_xpath_safe('//span/div/span/strong')
        if res:
            vec = res.text.split()
            if len(vec) > 1:
                return vec[1]
            else:
                print("Can't split {}".format(res.text))
        return ""
    
    def get_curr_city(self):
        res = self.find_element_by_xpath_safe('/html/body/div/div/div[2]/div/div[1]/div[4]/div/div/div[1]/div/table/tbody/tr/td[2]/div/a')
        if res:
            return res.text
        return ""
    
    def get_home_town(self):
        res = self.find_element_by_xpath_safe('/html/body/div/div/div[2]/div/div[1]/div[4]/div/div/div[2]/div/table/tbody/tr/td[2]/div/a')
        if res:
            return res.text
        return ""
        

#####################################
LOGIN = '----.com'
PASSWORD = '----'
BASIC_URL = 'https://mbasic.facebook.com/'
#####################################

parser = FacebookParser(login=LOGIN, password=PASSWORD)
parser.driver.get("https://mbasic.facebook.com/kristina.layus")


parser.driver.get("https://mbasic.facebook.com/kristina.layus")
print(parser.get_curr_city())

解決方法は?

テキストを印刷するには ロシア、モスクワ を誘導する必要があります。 WebDriverWait に対して visibility_of_element_located() を使用すると、以下のようになります。 xpath ベース ロケーター戦略 :

  • 印刷 ロシア、モスクワ :

    driver.get('https://mbasic.facebook.com/kristina.layus')
    print(WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//span[text()='Current City']//following::td//a"))).text)
    
    
  • 備考 : 以下のインポートを追加する必要があります。

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    
    

参考文献

関連する議論は、以下のサイトで見ることができます。 NoSuchElementException にあります。