在python中使用漂亮的汤和硒来解析html
Posted
技术标签:
【中文标题】在python中使用漂亮的汤和硒来解析html【英文标题】:parsing html by using beautiful soup and selenium in python 【发布时间】:2018-11-03 07:48:55 【问题描述】:我想通过在 python 中使用 BeautifulSoup 和 Selenium 来练习使用真实世界的示例 (Airbnb) 进行抓取。具体来说,我的目标是获取洛杉矶内的所有房源(房屋)ID。我的策略是打开一个 chrome 并访问 Airbnb 网站,在那里我已经手动搜索了洛杉矶的房屋并从这里开始。在这个过程中,我决定使用硒。之后,我想解析源代码中的 html 代码,然后找到当前页面上显示的列表 ID。然后基本上,只想遍历所有页面。 这是我的代码:
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+"§ion_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 页。我想我的代码并不完美,因为它给出了不稳定的输出。有没有人有类似的经历或者有人可以帮我解决问题吗?谢谢。
【问题讨论】:
为什么你现在使用selenium
,而不是requests
?那是因为 selenium 在 html 中提供了 javascript 创建的内容吗?有人可以在这里阐明一下吗?
【参考方案1】:
试试下面的方法
假设您在要解析的页面上,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
【讨论】:
以上是关于在python中使用漂亮的汤和硒来解析html的主要内容,如果未能解决你的问题,请参考以下文章