Python BeautifulSoup html-разбор - PullRequest
       6

Python BeautifulSoup html-разбор

2 голосов
/ 09 октября 2019

Впервые в Webscraping, и пытается разобрать html http://www.airportcodes.org и получить коды аэропортов вместе с названием города и штата в кадре данных. HTML выглядит следующим образом. По сути, кажется, что после каждого тега 'div class = "t6" строки элементов (город, штат и код аэропорта), которые мне нужно проанализировать, перечислены там с тегом разрыва, но, поскольку они разбиты по алфавиту, количество элементовв каждом разделе отличается.

<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tr><td bgcolor="#CBC7E0"><img height="2" src="img/0.gif" width="1"/></td></tr>
</table></div>
<a name="USA"></a>
<div class="t6"><div class="major"><b>A</b></div></div>

Aberdeen, SD (ABR) <br/>
Abilene, TX (ABI)<br/>
Adak Island, AK (ADK)<br/>
Akiachak, AK (KKI)<br/>
Akiak, AK (AKI)<br/>
Akron/Canton, OH (CAK)<br/>
Akuton, AK (KQA)<br/>
Alakanuk, AK (AUK)<br/>
Alamogordo, NM (ALM)<br/>
...

<div class="sectionBreak">
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tr><td bgcolor="#CBC7E0"><img height="2" src="img/0.gif" width="1"/></td></tr>
</table></div>
<div align="right"><div align="right"><a href="#top">return to top</a></div></div>
<a name="USB"></a>
<div class="t6"><div class="major"><b>B</b></div></div>

Bakersfield, CA (BFL)<br/>
Baltimore, MD (BWI)<br/>
Bangor, ME (BGR)<br/>
Bar Harbour, ME (BHB)<br/>
...

Коды до сих пор:

import bs4 as bs
sauce = urllib.request.urlopen('http://www.airportcodes.org/').read()
soup = bs.BeautifulSoup(sauce, 'lxml')

for tag in soup.find_all("div", class_="t6"):
    print(tag.next_sibling)

получает меня:

Aberdeen, SD (ABR) 


Bakersfield, CA (BFL)


Canton/Akron, OH (CAK)

Но это не так, как выглядит кодвозвращает только первый элемент рядом с указанным тегом. Любая помощь будет оценена!

Ответы [ 2 ]

0 голосов
/ 09 октября 2019

Используйте find_next_siblings(text=True), чтобы получить всю информацию об аэропорте.

from bs4 import BeautifulSoup
import requests
r=requests.get("http://www.airportcodes.org/").content
soup=BeautifulSoup(r,'html.parser')
for items in soup.select('div.t6'):
   for item in items.find_next_siblings(text=True):
       print(item)
0 голосов
/ 09 октября 2019

Во-первых, вам нужно извлечь теги br, чтобы правильно прочитать текстовый результат.

Затем вы можете повторить цикл type(tag) и проверить, является ли он bs4.element.NavigableString

* 1007. * Попробуйте это:
import requests
from bs4 import BeautifulSoup as soup
import bs4

url = "http://www.airportcodes.org/"
resp = requests.get(url)

page = soup(resp.text, 'html.parser')
for br in page.find_all('br'):
    br.extract()

for tag in page.find_all("div", class_="t6"):
    while type(tag.next_sibling) is bs4.element.NavigableString:
        tag = tag.next_sibling
        print(tag)

Результат:

Aberdeen, SD (ABR) 
Easton, PA (ABE)
...
...
Island Lake/Garden Hill, Canada (YIV)
Islay, United Kingdom (ILY)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...