【问题标题】:Webscraping a messy webpage with python and beautiful soup用 python 和漂亮的汤抓取一个凌乱的网页
【发布时间】:2015-01-26 17:28:37
【问题描述】:

您好,我正在尝试获取此页面上每个会计师事务所的名称、地址和电话号码:

http://accountantlist.com.au/x123-Accountants-in-Sydney.aspx?Page=0

我无法将树导航到信息所在的位置。

在 Python 中使用“美丽的汤”和“请求”这就是我尝试获取公司名称的方式:

import bs4
import requests

page = request.get('http://accountantlist.com.au/x123-Accountants-in-Sydney.aspx?Page=0')
soup = bs4.BeautifulSoup(page.text)

name = soup.select('......')

所以基本上我只是按照我使用 chrome 开发者工具找到的选择器沿着树向下走:

#ctl00_ContentPlaceHolder1_dgLawyers > tbody > tr:nth-child(2) > td > table > tbody > tr:nth-child(1) > td:nth-child(1) > a

但美汤不会接受这条路。我也试过不带“>”符号。

我尝试的第二种方法是只查看树并输入 css 选择器,从正文向下到我想要的位置,如下所示:

soup.select('body table tbody tr ... etc')

但这也不起作用。

我想这个问题最终归结为我怎样才能写出一个美丽的汤会接受的路径。有人能解释一下我如何解决这个问题吗?

感谢任何帮助。

【问题讨论】:

    标签: python html css-selectors beautifulsoup html-parsing


    【解决方案1】:

    通过id 获取公司表并遍历其中的每个table

    import bs4
    import requests
    
    page = requests.get('http://accountantlist.com.au/x123-Accountants-in-Sydney.aspx?Page=0')
    soup = bs4.BeautifulSoup(page.content)
    
    for company in soup.select('table#ctl00_ContentPlaceHolder1_dgLawyers tr > td > table'):
        name = company.a.text
        number = company.tr.find_all('td')[-1].text
        address = company.find_all('tr')[-1].td.text
    
        print {'name': name, 'number': number, 'address': address}
    

    打印:

    {'address': u'Level 4. 36 Carrington St Sydney. NSW 2000', 'name': u'A D Hill & Co', 'number': u'0292991733'}
    {'address': u'Suite 103, Level 1. 84 Pitt Street Sydney. NSW 2000', 'name': u'A2Z Insolvency Solutions', 'number': u'02 8065 6607'}
    {'address': u'810 George St Sydney. NSW 2000', 'name': u'AAA iPro Services Australia', 'number': u'1300554959'}
    {'address': u'Level 39. 2 Park St Sydney. NSW 2000', 'name': u'AccFin Services', 'number': u'0290047825'}
    ...
    

    【讨论】:

    • 哇,谢谢。在您的路径中,您如何跳过“table#ct100 ...”下的“tbody”标签?
    • @Kane 是的,我跳过tbody - 没有必要总是使用> 并遵循直接的父子关系。
    • @Kane: table#ct100... tr 注意使用空格代替 >。这假设您只有一层表嵌套。
    • @BoltClock 你是指table#ctl00_ContentPlaceHolder1_dgLawyers tr 还是tr > td?这是否意味着>只能用于下一级?
    • @alecxe [1] 在numberaddress 部分中做了什么?
    猜你喜欢
    • 1970-01-01
    • 2022-01-08
    • 2022-01-20
    • 1970-01-01
    • 2020-03-22
    • 1970-01-01
    • 2021-11-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多