2016-09-21 2 views
2

У меня есть эта таблица html: мне нужно получить конкретные данные из этой таблицы и назначить ее переменной, мне не нужна вся информация. flag = «Объединенные Арабские Эмираты», home_port = «Sharjah» и т. д. Поскольку на html-элементах нет «класса», как мы извлекаем эти данные.Таблица синтаксиса таблицы BeautifulSoup для тегов без классов

 r = requests.get('http://maritime-connector.com/ship/'+str(imo_number), headers={'User-Agent': 'Mozilla/5.0'}) 
    soup = BeautifulSoup(r.content, "lxml") 
    table = soup.find("table", { "class" : "ship-data-table" }) 
    for row in table.findAll("tr"): 
     tname = row.findAll("th") 
     cells = row.findAll("td") 


     print (type(tname)) 
     print (type(cells)) 

Я использую модуль python beautfulSoup.

<table class="ship-data-table" style="margin-bottom:3px"> 
         <thead> 
         <tr> 
          <th>IMO number</th> 
          <td>9492749</td> 
         </tr> 
         <tr> 
          <th>Name of the ship</th> 
          <td>SHARIEF PILOT</td> 
         </tr> 
                <tr> 
          <th>Type of ship</th> 
          <td>ANCHOR HANDLING VESSEL</td> 
         </tr> 
                       <tr> 
          <th>MMSI</th> 
          <td>470535000</td> 
         </tr> 
                       <tr> 
          <th>Gross tonnage</th> 
          <td>499 tons</td> 
         </tr> 
                       <tr> 
          <th>DWT</th> 
          <td>222 tons</td> 
         </tr> 
                       <tr> 
          <th>Year of build</th> 
          <td>2008</td> 
         </tr> 
                       <tr> 
          <th>Builder</th> 
          <td>NANYANG SHIPBUILDING - JINGJIANG, CHINA</td> 
         </tr> 
                       <tr> 
          <th>Flag</th> 
          <td>UNITED ARAB EMIRATES</td> 
         </tr> 
                              <tr> 
          <th>Home port</th> 
          <td>SHARJAH</td> 
         </tr> 
                              <tr> 
          <th>Manager & owner</th> 
          <td>GLOBAL MARINE SERVICES - SHARJAH, UNITED ARAB EMIRATES</td> 
         </tr> 
                                     <tr> 
          <th>Former names</th> 
          <td>SUPERIOR PILOT until 2008 Sep</td> 
         </tr> 
                </thead> 
        </table> 
+0

Я использую модуль питона beautfulSoup. Не использовать какое-либо регулярное выражение. –

ответ

2

Перейти по всем th элементов в таблице, получить текст и следующий текст td братьев и сестер:

from pprint import pprint 

from bs4 import BeautifulSoup 

data = """your HTML here""" 

soup = BeautifulSoup(data, "html.parser") 

result = {header.get_text(strip=True): header.find_next_sibling("td").get_text(strip=True) 
      for header in soup.select("table.ship-data-table tr th")} 
pprint(result) 

Это построить хороший словарь с заголовками как ключи и соответствующий td текстов в качестве значений :

{'Builder': 'NANYANG SHIPBUILDING - JINGJIANG, CHINA', 
'DWT': '222 tons', 
'Flag': 'UNITED ARAB EMIRATES', 
'Former names': 'SUPERIOR PILOT until 2008 Sep', 
'Gross tonnage': '499 tons', 
'Home port': 'SHARJAH', 
'IMO number': '9492749', 
'MMSI': '470535000', 
'Manager & owner': 'GLOBAL MARINE SERVICES - SHARJAH, UNITED ARAB EMIRATES', 
'Name of the ship': 'SHARIEF PILOT', 
'Type of ship': 'ANCHOR HANDLING VESSEL', 
'Year of build': '2008'} 
+1

Мне нравится это решение. –

+0

Спасибо @alecxe. Он работал .. –

+0

@alecxe Я получаю ошибки, когда значение равно none. AttributeError: объект «NoneType» не имеет атрибута «get_text». где я могу использовать try и exception –

0

Я хотел бы сделать что-то вроде этого:

html = """ 
     <your table> 
    """ 

from bs4 import BeautifulSoup 

soup = BeautifulSoup(html, 'html.parser') 

flag = soup.find("th", string="Flag").find_next("td").get_text(strip=True) 
home_port = soup.find("th", string="Home port").find_next("td").get_text(strip=True) 


print(flag) 
print(home_port) 

Таким образом, я убедившись, что я соответствовать тексту только в th элементов и получения содержимого следующего td

Смежные вопросы