从python

时间:2017-05-26 16:45:30

标签: python web beautifulsoup screen-scraping

我的代码会生成我想删除的额外表格。我想删除除此之外的所有其他表。

我的代码

import csv 
from bs4 import BeautifulSoup
import requests
import pandas as pd 
import telnetlib as tn
import os 
#import sys 
cwd = os.getcwd()
print (os.getcwd)
cwd = os.getcwd()
os.chdir('c:\\Users\STaiwo\Desktop\My R code')
page = requests.get("https://www.flyingblue.com/earn-and-spend-
miles/airlines/partner/180/china-eastern.html", verify = False)
print(page.content) ### Collects HTML content of site 
soup = BeautifulSoup(page.content, 'html.parser')
print(soup.prettify()) ## Cleans up the content of the site 
for table in soup.findAll('tbody'):
print('Table')
list_of_rows = []
for row in table.findAll('tr')[1:]:
    list_of_cells = []
    for cell in row.findAll('td'):
        text = ((cell.text.replace(' ', '')))
        list_of_cells.append(text)
    list_of_rows.append(list_of_cells)
print(list_of_rows)

我目前得到的结果: 表 [[' First Class',' F,U',' 150%'],[' P',' 125 %'],['商务舱',' J,C,D,I',' 125%'],['高级经济舱',' W' 110%'],['经济舱',' Y,B', ' 100%'],[' E,H,M',' 75%'],[' L,N,R,S ,V,K',' 50%'],[' T',' 30%'],['不符合条件应计',' Z,Q,G',' 0%']] 表 [] 表 [] 表 [['里程距离:6,482','总计'],['预订子类:125%',' 8,103&# 39;],[' 8,103']] 表 [['里程距离:6,482','总计'],['预订子类:125%','精英奖金: 75%',#9; 12,965'],[' 8,103',' 4,862']] 表 [['里程距离:6,482','总计'],['预订子类:50%',' 3,241&# 39;],[' 3,241']] 表 [['距离英里:6,482','总计'],['预订子类:50%','精英奖金: N / A',' 3,241'],[' 3,241',' 0']

我想要的结果: 表 [[' First Class',' F,U',' 150%'],[' P',' 125 %'],['商务舱',' J,C,D,I',' 125%'],['高级经济舱',' W' 110%'],['经济舱',' Y,B', ' 100%'],[' E,H,M',' 75%'],[' L,N,R,S ,V,K',' 50%'],[' T',' 30%'],['不符合条件应计',' Z,Q,G',' 0%']]

2 个答案:

答案 0 :(得分:0)

尝试将[:1]添加到soup.findAll('tbody')它会将结果限制为仅限第一个表。

答案 1 :(得分:0)

页面为我呈现法语,所以你想要的东西在我的浏览器中看起来像这样。 desired table

检查HTML我发现有几个表具有相同的id,即inlineTable。要选择正确的一个,即使发布者在页面上更改此表的位置,也必须能够以其他方式识别它。我注意到“Classe de cabine”这个标题是这张桌子独有的,它很可能在英文版中以“Cabin class”的形式出现。让我们用它。

首先,使用id获取所有表。看看每张桌子的文字'Classe de cabine'。当你发现吐出它的行时,除了标题行。

>>> import requests
>>> page = requests.get('https://www.flyingblue.com/earn-and-spend-miles/airlines/partner/180/china-eastern.html').text
>>> from bs4 import BeautifulSoup
>>> soup = BeautifulSoup(page, 'lxml')
>>> required_tables = soup.select('#inlineTable')
>>> len(required_tables)
7
>>> for table in required_tables:
...     if 'Classe de cabine' in table.text:
...         rows = table.findAll('tr')
...         for row in rows[1:]:
...             row
...             
<tr class="table-highlite-light">
<td rowspan="2" width="33%">Première Classe</td>
<td width="33%">F, U</td>
<td width="33%">150 %</td>
</tr>
<tr class="table-highlite-light">
<td>P</td>
<td>125 %</td>
</tr>
<tr class="table-highlite-light">
<td>Classe Affaires</td>
<td>J, C, D, I</td>
<td>125 %</td>
</tr>
<tr class="table-highlite-light">
<td>Premium Economy Classe</td>
<td>W</td>
<td>110 %</td>
</tr>
<tr class="table-highlite-light">
<td rowspan="4">Classe Économique</td>
<td>Y, B</td>
<td>100 %</td>
</tr>
<tr class="table-highlite-light">
<td>E, H, M</td>
<td>75 %</td>
</tr>
<tr class="table-highlite-light">
<td>L, N, R, S, V, K</td>
<td>50 %</td>
</tr>
<tr class="table-highlite-light">
<td>T</td>
<td>30%</td>
</tr>
<tr class="table-highlite-light">
<td>Non éligible pour l’accumulation</td>
<td>Z, Q, G</td>
<td>0 %</td>
</tr>