Разбор HTML с помощью прекрасного супа и селена в Python - PullRequest
0 голосов
/ 24 мая 2018

Я хотел потренироваться на примере реального мира (Airbnb), используя BeautifulSoup и Selenium в python.В частности, моя цель состоит в том, чтобы получить все списки (дома) ID в Лос-Анджелесе.Моя стратегия состоит в том, чтобы открыть Chrome и перейти на веб-сайт Airbnb, где я уже вручную искал дома в Лос-Анджелесе и начинал отсюда.До этого процесса я решил использовать селен.После этого я захотел проанализировать HTML-коды внутри исходных кодов, а затем найти идентификаторы списков, которые отображаются на текущей странице.Тогда в основном, хотел просто перебрать все страницы.Вот мои коды:

from urllib import urlopen
from bs4 import BeautifulSoup
from selenium import webdriver

option=webdriver.ChromeOptions()
option.add_argument("--incognito")

driver=webdriver.Chrome(executable_path="C:/Users/chromedriver.exe",chrome_options=option)

first_url="https://www.airbnb.com/s/Los-Angeles--CA--United-States/select_homes?refinement_paths%5B%5D=%2Fselect_homes&place_id=ChIJE9on3F3HwoAR9AhGJW_fL-I&children=0&guests=1&query=Los%20Angeles%2C%20CA%2C%20United%20States&click_referer=t%3ASEE_ALL%7Csid%3Afcf33cf1-61b8-41d5-bef1-fbc5d0570810%7Cst%3AHOME_GROUPING_SELECT_HOMES&superhost=false&title_type=SELECT_GROUPING&allow_override%5B%5D=&s_tag=tm-X8bVo"
n=3

for i in range(1,n+1):
    if (i==1):
        driver.get(first_url)
        print first_url
        #HTML parse using BS
        html =driver.page_source
        soup=BeautifulSoup(html,"html.parser")
        listings=soup.findAll("div",{"class":"_f21qs6"})

        #print out all the listing_ids within a current page
        for i in range(len(listings)):
            only_id= listings[i]['id']
            print(only_id[8:])

    after_first_url=first_url+"&section_offset=%d" % i
    print after_first_url
    driver.get(after_first_url)
    #HTML parse using BS
    html =driver.page_source
    soup=BeautifulSoup(html,"html.parser")
    listings=soup.findAll("div",{"class":"_f21qs6"})

    #print out all the listing_ids within a current page
    for i in range(len(listings)):
        only_id= listings[i]['id']
        print(only_id[8:])

Если вы обнаружите какие-либо неэффективные коды, пожалуйста, поймите, так как я новичок.Я сделал эти коды, читая и просматривая несколько источников.Во всяком случае, я думаю, у меня есть правильные коды, но проблема в том, что каждый раз, когда я запускаю это, я получаю другой результат.Это означает, что он зацикливается на страницах, но иногда он дает результаты только для определенного количества страниц.Например, он зацикливает страницу page1, но не выдает никакого соответствующего вывода, зацикливает страницу page2 и дает результаты, но не для page3.Это настолько случайно, что дает результаты для некоторых страниц, но не для других.Кроме того, иногда он зацикливает страницы 1, 2, 3, ... в порядке, но иногда он зацикливает страницу 1, а затем переходит на последнюю страницу (17) и затем возвращается на страницу 2.Я предполагаю, что мои коды не идеальны, поскольку это дает нестабильные результатыУ кого-нибудь был подобный опыт или кто-то может мне помочь, в чем проблема?Благодарю.

1 Ответ

0 голосов
/ 24 мая 2018

Попробуйте метод ниже

Предполагая, что вы находитесь на странице, которую хотите проанализировать, Selenium сохраняет исходный HTML-код в атрибуте page_source драйвера.Затем вы должны загрузить page_source в BeautifulSoup следующим образом:

In [8]: from bs4 import BeautifulSoup

In [9]: from selenium import webdriver

In [10]: driver = webdriver.Firefox()

In [11]: driver.get('http://news.ycombinator.com')

In [12]: html = driver.page_source

In [13]: soup = BeautifulSoup(html)

In [14]: for tag in soup.find_all('title'):
   ....:     print tag.text
   ....:     
   ....:     
Hacker News
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...