Python 3: Как очистить текст от div, который содержит несколько значений класса - PullRequest
0 голосов
/ 06 сентября 2018

Я пытаюсь веб-очистить веб-сайт ( Вот ссылка на веб-сайт ), но у div на странице, кажется, есть несколько атрибутов класса, что затрудняет мне очистку данных. Я пытался найти исторические вопросы, опубликованные в Stackoverflow, но не смог найти ответ, который хотел. Ниже приведена часть кода, который я извлек с сайта:

<div data-reactid="118">
  <div class="ue-ga base_ ue-jk" style="margin-left:-24px;margin-bottom:;" data-reactid="119">
    <div style="display: flex; flex-direction: column; width: 100%; padding-left: 24px;" data-reactid="120">
      <div class="ue-a3 ue-ap ue-a6 ue-gb ue-ah ue-n ue-f5 ue-ec ue-gc ue-gd ue-ge ue-gf base_ ue-jv ue-gz ue-h0 ue-h1" data-reactid="121">
        <div class="ue-a6 ue-bz ue-gb ue-ah ue-gg ue-gh ue-gi" data-reactid="122">
          <div class="ue-bn ue-bo ue-cc ue-bq ue-g9 ue-bs" title="Want to extract this part" data-reactid="123">
            Want to extract this part
          </div>
        </div>
      </div>
    </div>
  </div>
</div>

Что я хочу извлечь, так это текст, где написано " Хотите извлечь эту часть ". Я действительно думал о том, чтобы очистить данные с помощью данных, но разные страницы имеют разные номера данных, поэтому это не очень хорошая идея. Я также хочу сообщить, что имена классов не являются уникальными.

Кто-нибудь может мне помочь? Очень признателен.

Ответы [ 5 ]

0 голосов
/ 06 сентября 2018

Согласно HTML , которым вы поделились для извлечения текста Хотите извлечь эту часть , так как элемент является React элементом, который вы должны вызвать WebDriverWait , чтобы элемент был видимым , и вы можете использовать любое из следующих решений:

  • Использование атрибута title:

    myText = WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "div.base_ div[title]"))).get_attribute("title")
    
  • Использование innerHTML:

    myText = WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "div.base_ div[title]"))).get_attribute("innerHTML")
    

Примечание : Вы должны добавить следующий импорт:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
0 голосов
/ 06 сентября 2018

Меню:

enter image description here
- все меню для использования в цикле, селектор CSS: div.base_ h3
- меню по имени xpath: //div[contains(@class,'base_')]//h3[.='Big Mac® Bundles']

Продовольственные карточки

enter image description here
- заголовки, селектор CSS: div[title]
- названия, xpath: //div[./div[@title]]/div[@title]
- цены, xpath: //div[./div[@title]]//span
Если вы хотите зациклить:

cards = driver.find_elements_by_xpath("//div[./div[@title]]")
for card in cards:
     title = card.find_element_by_css_selector("div[title]")
     price = card.find_element_by_css_selector("span")
     #or using xpath
     #title = card.find_element_by_xpath("./div[@title]")
     #price = card.find_element_by_xpath(".//span")

Меню категорий:

enter image description here
- все категории, css селектор: a[href*='category']

0 голосов
/ 06 сентября 2018

Если классы всегда остаются одинаковыми для этого конкретного элемента на каждой странице, вы можете настроить таргетинг на него с помощью этого селектора:

.ue-bn.ue-bo.ue-cc.ue-bq.ue-g9.ue-bs

Однако есть много других селекторов, которые вы можете использовать, но все зависит от того, являются ли они уникальными и единообразными на всех страницах.

0 голосов
/ 06 сентября 2018

Это может помочь вам

from bs4 import BeautifulSoup
html = """<div data-reactid="118">
<div class="ue-ga base_ ue-jk" style="margin-left:-24px;margin-bottom:;" data-reactid="119">
<div style="display: flex; flex-direction: column; width: 100%; padding-left: 24px;" data-reactid="120">
  <div class="ue-a3 ue-ap ue-a6 ue-gb ue-ah ue-n ue-f5 ue-ec ue-gc ue-gd ue-ge ue-gf base_ ue-jv ue-gz ue-h0 ue-h1" data-reactid="121">
    <div class="ue-a6 ue-bz ue-gb ue-ah ue-gg ue-gh ue-gi" data-reactid="122">
      <div class="ue-bn ue-bo ue-cc ue-bq ue-g9 ue-bs" title="Want to extract this part" data-reactid="123">
        Want to extract this part
      </div>
    </div>
  </div>
</div>
</div>
</div>"""

soup = BeautifulSoup(html,'html.parser')
tag = soup.find('div', attrs={'class':'ue-bn'})
text = (''.join(tag.stripped_strings))
print (text)
0 голосов
/ 06 сентября 2018

вы можете использовать jQuery, как показано ниже.

$("div[title=Want to extract this part]").text();

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