Как получить текстовую переменную с динамическим идентификатором в Python - PullRequest
0 голосов
/ 06 февраля 2019

В настоящее время я пытаюсь собрать биты текстовых данных по всей веб-странице.Сначала я беру все веб-страницы и медленно просматриваю веб-страницы, собирая нужные данные с каждой страницы.У меня возникают проблемы, например, захват предметов, таких как квадратные метры или окрестности, из-за динамических идентификаторов.Многие из примеров, которые я видел через XPath или CSS-селектор, включают поиск текста, но это меняется на каждой странице, которую я пытаюсь очистить.Есть ли способ запечатлеть квадратные метры или окрестности?

from bs4 import BeautifulSoup

from selenium import webdriver as wd
from selenium.common.exceptions import StaleElementReferenceException
from selenium.common.exceptions import TimeoutException
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC

driver = wd.Firefox()

quote_page = "https://www.zillow.com/homes/for_sale/Minneapolis-MN/condo_type/5983_rid/0-175000_price/0-685_mp" \
             "/globalrelevanceex_sort/45.075097,-93.09248,44.866211,-93.430309_rect/11_zm/"

# print (soup.prettify())

driver.get(quote_page)
html = driver.page_source
soup = BeautifulSoup(html, 'html.parser')
webURL = []

while True:
    try:
        element = WebDriverWait(driver, 5).until(EC.presence_of_element_located((By.ID, "element_id")))
    except TimeoutException:
        print("Timeout Exception")

    elems = driver.find_elements_by_xpath("//a[@href]")

    for elem in elems:
        try:
            if 'homedetails' in elem.get_attribute("href"):
                print(elem.get_attribute("href"))
                webURL.append(elem.get_attribute("href"))
        except StaleElementReferenceException:
            print("test")
    try:
        driver.find_element_by_link_text('NEXT').click()
        print('Going to next page')
    except NoSuchElementException:
        break

for item in webURL:
    print(item)

newPage = webURL[0]

driver.get(newPage)

price = driver.find_element_by_class_name("price").text

print(price)

Код в настоящее время может захватывать ссылки, а затем открывать веб-страницы.Мне удалось получить данные, которые имеют уникальный элемент имени.

1 Ответ

0 голосов
/ 06 февраля 2019

Кажется, вы пытаетесь найти элемент (или содержимое элемента) на основе идентификатора содержимого с помощью селектора CSS, который является переменным.

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

Самый простой способ - это получить список всех шаблонов данных сайтов недвижимости, которые вы хотите сопоставить (например, по ссылке).вашего сообщения, все элементы идентификатора якорей начинаются с одинаковых четырех символов идентификатора ("yui _ [...]") и одного и того же шаблона href ("/homedetails/[...]").

Вы можете использовать эту информацию вместе с некоторыми полезными функциями XPath или селекторами CSS для достижения вашей цели:

  • contains() и starts-with() Функции XPath:

    //div[contains(., "Desired text")]
    //div[starts-with(., "Desired text")]
    
  • preceding, preceding-sibling, following и following-sibling ось, которая может помочь вам, если вы знаете относительную позицию вновь сгенерированного блока элементов, который необходимо найти

Также есть CSS-селекторы для частичного соответствия атрибутов элемента:

a[href*=desiredSubstring]  # contains
a[href^=desiredSubstring]  # starts-with
a[href$=desiredSubstring]  # ends-with

И вы всегда можете найти больше элементов, чем необходимо, и отфильтроватьпозже в Python, пример:

import re

pattern = re.compile(r"^This \w+ text.$")

elements = driver.find_elements_by_css_selector("div.some_class")
for element in elements:
    match = pattern.match(element.text)
    if match:
        print(element.text)

Удачи!

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