BeautifulSoup: <ul>Элементы не будут отображаться в списке детей.Проблема с парсером? - PullRequest
0 голосов
/ 24 февраля 2019

Вот мой код:

import bs4 as bs
from urllib.request import urlopen

page = urlopen("https://www.netimoveis.com/locacao/minas-gerais/belo-horizonte/bairros/santo-antonio/apartamento/#1/").read()

soup = bs.BeautifulSoup(page, "lxml")

div_lista_locacao = soup.select("div#lista-locacao")[0]

ul_tags = list(div_lista_locacao.children)

print("ul_tags = ",ul_tags)

(Вы видите, что я напечатал список, содержащий дочерние элементы div_lista_locacao).

Вывод:

ul_tags =  ['\n']

(И он показывает только разрыв строки, хотя есть фактические дочерние элементы, как вы можете видеть ниже).

Это HTML-код моего источника:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" style="" class=" js flexbox flexboxlegacy canvas canvastext webgl no-touch geolocation postmessage no-websqldatabase indexeddb hashchange history draganddrop websockets rgba hsla multiplebgs backgroundsize borderimage borderradius boxshadow textshadow opacity cssanimations csscolumns cssgradients no-cssreflections csstransforms csstransforms3d csstransitions fontface generatedcontent video audio localstorage sessionstorage webworkers applicationcache svg inlinesvg smil svgclippaths"
  lang="pt">
<head></head>
<body id="topo_geral" itemscope="" itemtype="http://schema.org     
   /WebPage">
  <div id="container-hero" class="container-fluid"></div>
  <div id="resultado" class="container-fluid page-container">
    <!-- DESKTOP -->
    <div id="banner-resultado" class="col col-xs-12 col-sm-12 col-
       md-12col-lg-12 text-center hide"></div>
    <div class="row hidden-xs hidden-sm">
      <div class="col col-xs-12 col-sm-12 col-md-3 col-lg-3 filtro-  
         resultado"></div>
      <div class="col col-xs-12 col-sm-12 col-md-9 col-lg-9 box-
         resultado-hidden-xs hidden-sm"></div>
      <button id="btn-ordenacao-por-valor" data-ordenar="asc" class="btnbtn-valor btn-branco"></button>
      <ul class="nav nav-tabs" role="tablist" id="myTab"></ul>
      <div class="tab-content">
        <div role="tabpanel" class="tab-pane active" id="locacao">
          #Currently manipulating this tag beneath. This is the "div_lista_locacao" variable.
          <div id="lista-locacao" class="col col-xs-12 col-sm-12 col-
            md-12 col-lg-12 nopadmar">
            ##Need to iterate between these 'ul' tags beneath and parse the text internally.
            ## But they won't show up in the .children list.
              <ul class="ul-resultado paginacao paginacao_numero_1" style="display: block;"></ul>
              <ul class="ul-resultado paginacao paginacao_numero_2" style="display: block;"></ul>
              <ul class="ul-resultado paginacao paginacao_numero_3" style="display: none;"></ul>
          </div>
        </div>
      </div>
    </div>
  </div>
</body>

</html>

##I can reply with the contents inside the 'ul' tags if requested. 
##But I just thought it wouldn't be necessary for this particular question.

Я использую "lxml" для его анализа, но я уже пытался изменить его на "html.parser" , "html5lib" и "xml" .Все дают схожие результаты.

Итак, это парсер?Это библиотека, которую я использовал для загрузки веб-страницы?Разве это не скачать этот раздел?Или, может быть, ошибка BS?ИДК.

Ответы [ 3 ]

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

Как уже упоминалось в ответе @facelessuser, контент загружается динамически с помощью Javascript.

Хорошая новость заключается в том, что вы можете сделать такой же запрос ajax через python и получить ответ json.Он содержит все данные, которые вам требуются.Я просто распечатываю цену.

import bs4 as bs
from urllib.request import urlopen
import json
page = urlopen("https://www.netimoveis.com/locacao/minas-gerais/belo-horizonte/bairros/santo-antonio/apartamento/?pagina=1&busca=%7B%22valorMinimo%22%3Anull%2C%22valorMaximo%22%3Anull%2C%22quartos%22%3Anull%2C%22suites%22%3Anull%2C%22banhos%22%3Anull%2C%22vagas%22%3Anull%2C%22idadeMinima%22%3Anull%2C%22areaMinima%22%3Anull%2C%22areaMaxima%22%3Anull%2C%22bairros%22%3A%5B%22santo-antonio%22%5D%2C%22ordenar%22%3Anull%7D&outrasPags=true&quantidadeDeRegistro=20&first=false").read()
properties=json.loads(page)['lista']
for item in properties:
    print(item['valorLocacaoFormat'])

Вывод

R$ 1.490,00
R$ 2.300,00
R$ 1.480,00
R$ 1.600,00
R$ 1.700,00
R$ 2.100,00
R$ 1.600,00
...

Примечание. Чтобы найти URL-адрес ajax, который я использую, откройте вкладку сети в инструментах разработчика браузера и перейдитена URL.Вы можете увидеть, как выполняется запрос xhr.

enter image description here

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

Контент загружается динамически с помощью Javascript, как @facelessuser и @Bitto сказал. Если вы идете на страницу, затем нажимаете view-source и ищите свой идентификатор, вы не видите никакой ul.

В этомcase с использованием selenium является более мощным для получения элементов из javascript.

Если вы не установили драйвер, вы можете установить его в http://chromedriver.chromium.org/getting-started

Весь код:

from selenium import webdriver


options = webdriver.ChromeOptions()
driver = webdriver.Chrome(chrome_options=options,
                          executable_path=r'/Users/omertekbiyik/PycharmProjects/bitirme/chromedriver')
driver.get('https://www.netimoveis.com/locacao/minas-gerais/belo-horizonte/bairros/santo-antonio/apartamento/#1/')

x = driver.find_elements_by_css_selector("div[id='lista-locacao']")

for a in x:
    print a.text


driver.close()

ВЫХОД:

partamento para alugar de 3 quartos
Santo Antônio - Rua Engenheiro Zoroastro Torres, 149
More na região nobre do Santo Antônio! Local tranquilo com comércio próximo, esquina com Av. Prudente de Moraes. Prédio familiar com 08 andares e 02 elevadores, 02 aptos por andar,
3
quartos
2
suítes
3
banhos
2
vagas
R$ 1.490
condomínio: R$ 1100
código: 724362
96 m²
Apartamento para alugar de 3 quartos
Santo Antônio - Rua Paulo Afonso, 587
ALUGUE SEM FIADOR pelo melhor preço: 1 + 11 parcelas de R$ 292,50**Mediante aprovação de ficha cadastral do locatário pela seguradoraO seu próximo lar na melhor localização do bair
3
quartos
1
suíte
2
banhos
2
vagas
R$ 2.300
condomínio: R$ 1452
código: 677116
175 m²
...UP TO FINISH ALL UL TAGS

И вы можете увидеть все части HTML в div, как

for a in x:
    print a.get_attribute('innerHTML')
0 голосов
/ 24 февраля 2019

Я думаю, что контент ul загружается динамически с помощью JavaScript после загрузки страницы.Запустив ваш скрипт и распечатав div_lista_locacao, я получу:

[<div class="col col-xs-12 col-sm-12 col-md-12 col-lg-12 nopadmar" id="lista-locacao">
</div>]

Как видите, в этом div нет элементов для выбора ul.Возможно, вам потребуется использовать что-то вроде селена для получения динамического содержимого, а затем выбрать ul s, как только вы получите полный HTML, но использование только requests недостаточно, поскольку вы должны выполнить JavaScript для загрузки списков в div элемент первый.

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