【问题标题】:Python BeautifulSoup html parsingPython BeautifulSoup html 解析
【发布时间】:2020-02-06 13:05:36
【问题描述】:

Webscraping 的新手,并尝试解析 http://www.airportcodes.org 的 html 并将机场代码以及城市名称和州放入数据框中。 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)

但这是错误的,因为看起来代码只返回指定标签旁边的第一项。任何帮助将不胜感激!

【问题讨论】:

    标签: python html css parsing beautifulsoup


    【解决方案1】:

    首先,您必须提取br 标签,才能正确读取文本结果。

    然后你可以遍历type(tag)并测试它是否是bs4.element.NavigableString

    试试这个:

    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)
    

    【讨论】:

    • 谢谢,这似乎几乎可以工作,但删除了一些值(机场代码),即没有得到所有想要的结果。有什么帮助吗?
    • 得到与您相同的结果,但您注意到,只有 1 个值以“A”开头,即 Aberdeen, SD (ABR),但正如您从我的原始帖子中看到的那样,下一个值是 Abilene, TX (ABI),现在找不到了
    【解决方案2】:

    使用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)
    

    【讨论】:

    • 谢谢,这似乎几乎可以工作,但删除了一些值(机场代码),即没有得到所有想要的结果。有什么帮助吗?
    • @Si_CPyR :您能否提供一个示例,您在诊断哪个机场代码时遇到了问题?
    猜你喜欢
    • 2014-03-06
    • 2011-07-21
    • 2018-07-10
    • 2011-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多