【问题标题】:Python: Scraping table/ get a specific column when the first column is not always equalPython:当第一列并不总是相等时,抓取表/获取特定列
【发布时间】:2019-09-14 11:35:46
【问题描述】:

我正在尝试提取下表的第二列,即肌肉的名称: http://www.drjastrow.de/WAI/Vokabular/Muskeln-A1.html

到目前为止,这是我的代码:

    import requests
    import time
    from bs4 import BeautifulSoup as soup

    url = "http://www.drjastrow.de/WAI/Vokabular/Muskeln-A1.html"
    links = []
    time.sleep(1)
    print(url)
    page = requests.get(url)
    text = soup(page.text, 'html.parser')
    table = text.select('table')[1]
    rows = table.find_all('tr')[2:]

    names = []
    for row in rows:
        names.append(row.find_all('td')[1].text.replace('\n', ''))

    print(names)

问题是它有时会得到行的第二列,有时会得到第三列,这取决于第一列是否超过两行。有道理,但我不知道如何解决。

感谢您的任何想法!

【问题讨论】:

    标签: python html web-scraping beautifulsoup


    【解决方案1】:

    试试这个:

    import pandas as pd
    
    url = 'http://www.drjastrow.de/WAI/Vokabular/Muskeln-A1.html'
    
    tables = pd.read_html(url)
    print(tables[1][1])
    

    输出是标题为“Muskel - 肌肉 (Terminologia anatomica)”的列。

    【讨论】:

    • 哇,这真的很容易。还没有和熊猫一起工作过,但似乎我真的应该研究一下!谢谢
    • @JuRoSch - 是的,我喜欢熊猫!很高兴它对你有用。
    【解决方案2】:

    您可能会考虑到第二行始终具有特定宽度的事实:width="15%"。您可以尝试在每一行中选择具有此宽度的单元格(注意最后一列有时具有相同属性的事实,您应该选择第一个元素)。

    【讨论】:

      【解决方案3】:

      您可以结合使用属性选择器和类型选择器来定位具有name 属性的a 类型/标签元素。比 pandas 更轻量级,特别是如果您只想要那些肌肉名称。

      from bs4 import BeautifulSoup as bs
      import requests
      
      r = requests.get('http://www.drjastrow.de/WAI/Vokabular/Muskeln-A1.html')
      soup = bs(r.content,'lxml')
      muscles = [a['name'] for a in soup.select('a[name]')]
      print(muscles)
      

      【讨论】:

        猜你喜欢
        • 2022-09-28
        • 2018-01-14
        • 2013-01-23
        • 2022-11-02
        • 1970-01-01
        • 1970-01-01
        • 2017-11-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多