我有一个看起来像这样的页面。
<tr>
<th class="fst" scope="col">time(*)</th>
<th scope="col">field</th>
<th scope="col">1 session</th>
<th scope="col">2 session</th>
<th scope="col">3 session</th>
<th scope="col">4 session</th>
<th scope="col">5 session</th>
<th scope="col">6 session</th>
</tr>
<tr>
<th class="num_area" rowspan="11" scope="row">77</th>
<td class="txt_category">bus</td>
<td>58456</td>
<td>62891</td>
<td>63076</td>
<td>53282</td>
<td>54805</td>
<td>55097</td>
</tr>
<tr>
<td class="txt_category">taxi</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>62891</td>
<td>-</td>
<td>-</td>
</tr>
<tr>
<th class="fst" scope="col">time(*)</th>
<th scope="col">field</th>
<th scope="col">7 session</th>
<th scope="col">8 session</th>
<th scope="col">9 session</th>
<th scope="col">10 session</th>
<th scope="col">11 session</th>
<th scope="col">12 session</th>
</tr>
<tr>
<th class="num_area" rowspan="11" scope="row">100</th>
<td class="txt_category">bus</td>
<td>1342</td>
<td>138470</td>
<td>878840</td>
<td>7653</td>
<td>4422</td>
<td>87630</td>
</tr>
正如你所看到的,这个网站有一个表,其中有许多没有类或标签,并且有很多和。由于该值与会话不同,因此我必须废弃会话和值对等数据。 此外,字段名称是不同的(公共汽车,出租车..)我也必须得到这些名称。 理想的结果就是这样。
result=[
{session=1, scope=77, fieldname=bus, count=58456},
{session=1, scope=77, fieldname=taxi, count=0},
{session=2, scope=77, fieldname=bus, count=62891},
]
所以我到目前为止尝试了这样的事情。
def scraping():
driver = webdriver.PhantomJS()
driver.get(url)
soup = BeautifulSoup(driver.page_source, 'html5lib')
result = []
for row in soup.findAll('tr'):
header = row.findAll('th')
if len(header) < 1:
continue
if len(header) == 7:
for num in range(1, 7):
date = header[num].find(text=True)
if len(header) == 8:
for num in range(1, 8):
date = header[num].find(text=True)
body = row.findAll('td')
if len(body) < 1:
continue
field_name = body[0].find(text=True)
template['field_name'] = field_name
for num in range(1, 7):
cost = body[num].find(text=True)
template['cost'] = cost
result.append(template)
有时长度是7,有时是8,所以我决定使用范围。但是,在使用它之后,似乎结果列表只有一个不是我想要的字典。我想知道是否有好办法废除这些价值观。