用Python改变HTML中下拉菜单的值

2024-07-04 07:40:26 发布

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

我在做拉网练习。我想得到欧洲的汽车销售数据,然后准备一些数据。 因此我发现http://carsalesbase.com/european-car-sales-data/是一个非常好的数据源。 我设法得到了一个特定制造商的特定车辆的销售数据。如果我修改了URL,我还可以访问多辆车的销售号码,可能还有多个制造商。在

这是我的代码:

import requests
from bs4 import BeautifulSoup as bs
import numpy as np
import matplotlib.pyplot as plt

car_type=0
car_spec=['ford-focus','ford-fiesta','ford-ecosport']

my_url='http://carsalesbase.com/european-car-sales- 
data/ford/'+car_spec[car_type]+'/'

page = requests.get(my_url)
soup = bs(page.content, 'html.parser')
t=soup.find("table")

rows=t.find_all('td')

我可以访问三辆福特汽车的销售数据。在

不过,我想迭代每个制造商的每辆车。 Carsalesbase为此提供了两个下拉菜单。 一个是给制造商的。我已经从菜单中读取了所有可能的值。 这是“值/文本”对:

^{pr2}$

第二个下拉列表是针对汽车本身的。只要在第一个菜单中没有选择汽车品牌,此选项只包含默认值。在第一个下拉列表中选择制造商后,第二个下拉列表将填充此制造商的所有汽车。 我想做的是编程填充第一个下拉菜单,这样我就可以读出第二个菜单了。在

在那之后,我相信我可以通过这个http方案访问所有的销售数据:

http://carsalesbase.com/?hide-value=1&brand-option=17&model-option=2089&css-go=Go

我在网络标签中的chrome开发工具中观察到了这一点。请注意,“品牌选项=17”对应于阿尔法罗密欧,它与我的手动输入相匹配。在

我想我缺少的是如何用程序来填充下拉菜单。在

有人能帮忙吗?在

ps:我读过关于Selenium的文章,它似乎是一个合适的工具,但是我不喜欢当你使用它的时候浏览器会打开。一定有更简单的方法。在

谢谢!在

附加:

经过一番研究,我发现不管怎样,你都可以用我正在使用的请求包来完成。这似乎是html中的相关部分:

<form action="http://carsalesbase.com/" class="search-form" method="get" 
role="search">
<input class="" id="hide-value" name="hide-value" type="hidden" value="1"/>
<select class="kelas1" id="brand-option" name="brand-option">
<option value="0">Select Brand</option>
<option value="82"> Group</option> <option value="17">Alfa Romeo</option> 
<option value="1">Alpina</option> ... <option value="74">Volkswagen</option> 
<option value="26">Volvo</option>
</select>
<select class="kelas1" id="model-option" name="model-option">
<option value="0">Select Model</option>
</select>
<input name="css-go" type="submit" value="Go"/>
</form>

但还是不知道该怎么填。在


Tags: 数据nameimportcomhttpvaluetypecar
2条回答

想办法解决这个问题。我看到第二个下拉列表由一个Java脚本填充。此脚本根据您在第一个下拉列表中选择的内容生成第二个下拉列表的可能条目。在

然而,第二个下拉列表中的数据存储在该网站上的另一个Java脚本中。在

所以我把HTML中所有的“script”标签都刮了,直到找到一个包含我需要的数据的标签。我可以用编程方式打开该脚本,并将数据从脚本内部传输到主python脚本。在

这样我就可以迭代这个http方案:

http://carsalesbase.com/?hide-value=1&brand-option=17&model-option=2089&css-go=Go

这是一个非常专业的解决方案,显然您需要selenium,或者可以与使用JS的scrape网站相媲美。 但对于我的问题,这已经足够了。在

有一种方法可以使用pandas read_html从html读取表。只需几行代码就可以将表html传递到pandas DataFrame中。在

对我来说 http://carsalesbase.com/?hide-value=1&brand-option=17&model-option=2089&css-go=Go不返回响应。在

import requests
import lxml
from lxml import html
import pandas as pd
import html5lib
from bs4 import BeautifulSoup
from tabulate import tabulate

url = "http://carsalesbase.com/european-car-sales-data/alfa-romeo/"

r = requests.get(url)
tree = html.fromstring(r.content)

tables = tree.xpath('//table')

for table in tables:
  df = pd.read_html(html.tostring(table), header=0)
  df = df[0]
  print(tabulate(df, headers='keys', tablefmt='psql'))

打印如下:

^{pr2}$

相关问题 更多 >

    热门问题