Python(bs4+selenium)在使用selenium模拟某些操作后搜索html数据

2024-09-28 12:15:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我编写了以下代码:

driver = webdriver.Firefox()
driver.get('https://www.ybpn.de/ihre-parfuemerien/')

search_elem = driver.find_element_by_id("search_input") # Find search form
search_elem.send_keys("80331") # Enter zip code - later based on a .txt of zip codes
submit_button = driver.find_element_by_name("tx_ybpn_storefinder[submit]").submit() # press "submit" button, search

Selenium打开url,搜索“输入字段”,输入邮政编码,然后按submit

现在我想用bs4搜索“新页面”(在上面代码中的操作之后)中的特定数据

通常我会使用以下代码:

url = ("https://www.ybpn.de/ihre-parfuemerien/")
page = requests.get(url)
soup = BeautifulSoup(page.text, features="html.parser")

问题:当我使用“正常”url时,它会加载动态地图,而不加载我需要的数据。在我使用selenium执行搜索后,该页面没有创建唯一的url。它只在url的末尾添加了一个特定的cHash值,但是当我连接到这个url时,Im重定向到“普通页面”——没有url加载带有我的搜索结果的页面

问题:如何在“搜索特定邮政编码”操作之后获取特定url或创建变量,以使用bs4搜索我需要的数据

我真的希望我的意思可以理解!谢谢大家!


Tags: 数据代码httpsurlsearchgetwwwdriver
2条回答

要获取特定邮政编码的联系人,可以使用以下示例:

import requests
from bs4 import BeautifulSoup


url = 'https://www.ybpn.de/ihre-parfuemerien/'
data = {'tx_ybpn_storefinder[searchReq][term]': '80331'}

soup = BeautifulSoup(requests.get(url).content, 'html.parser')
data['tx_ybpn_storefinder[__trustedProperties]'] = soup.select_one('#storefinder [name*=__trustedProperties]')['value']
soup = BeautifulSoup(requests.post(url, data=data).content, 'html.parser')

for item in soup.select('.storefinder__list-item'):
    print(item.select_one('.storefinder-item__title').get_text(strip=True))
    print(item.select_one('.storefinder-item__adress').get_text(strip=True, separator='\n'))
    print(item.select_one('.storefinder-item__contact').get_text(strip=True))
    print('-' * 80)

印刷品:

Parfümerie Brückner
Rindermarkt 1
80331
München
Tel.:+49 89 263181
                                        
Parfümerie Brückner
Marienplatz 8
80331
München
Tel.:+49 89 223874
                                        
City Parfümerie Rathjen
Tal 14
80331
München
Tel.:+49 89 2285222
                                        
Die kleine Theatiner Parfümerie
Theatiner Straße 35
80333
München
Tel.:+49 89 267919
                                        
City Parfümerie Rathjen
Stachus Passagen Karlsplatz 1. UG
80335
München
Tel.:+49 89 55 4009
                                        

...and so on.

我有一个基于公认答案的想法,那就是获取整个身体的内部HTML

    driver = webdriver.Firefox()
    driver.get('https://www.ybpn.de/ihre-parfuemerien/')
    
    search_elem = driver.find_element_by_id("search_input") # Find search form
    search_elem.send_keys("80331") # Enter zip code - later based on a .txt of zip codes
    submit_button = driver.find_element_by_name("tx_ybpn_storefinder[submit]").submit() # press "submit" button, search

soup = BeautifulSoup(page.find_element_by_tag_name("body").get_attribute('innerHTML'), features="html.parser")
for item in soup.select('.storefinder__list-item'):
    print(item.select_one('.storefinder-item__title').get_text(strip=True))
    print(item.select_one('.storefinder-item__adress').get_text(strip=True, separator='\n'))
    print(item.select_one('.storefinder-item__contact').get_text(strip=True))
    print('-' * 80)

相关问题 更多 >

    热门问题