Python 使用BeautifulSoup从网页获取特定表

Python 使用BeautifulSoup从网页获取特定表,python,beautifulsoup,web-crawler,Python,Beautifulsoup,Web Crawler,我想从上的第三个表中获取数据。 这是代码,我需要一些帮助 import requests from bs4 import BeautifulSoup url = "http://www.dividend.com/dividend-stocks/" r = requests.get(url) soup = BeautifulSoup(r.content, "html5lib") # Skip first two tables tables = soup.find("table") tables

我想从上的第三个表中获取数据。 这是代码,我需要一些帮助

import requests
from bs4 import BeautifulSoup

url = "http://www.dividend.com/dividend-stocks/"
r = requests.get(url)
soup = BeautifulSoup(r.content, "html5lib")

# Skip first two tables
tables = soup.find("table")
tables = tables.find_next("table")
tables = tables.find_next("table")

row = ''
for td in tables.find_all("td"):
    if len(td.text.strip()) > 0:
        row = row + td.text.strip().replace('\n', ' ') +','
        # Handle last column in a row, remove extra comma and add new line
        if td.get('data-th') == 'Pay Date':
            row = row[:-1] + '\n'
print(row)
  • 有没有更好的方法跳过这两张桌子?或者有没有一种简单的方法可以跳过BeautifulSoup中的一大块代码?如果是,我如何定位它
  • 不知何故,代码的输出顺序与web上的不同。web上的表如下所示:
  • 但是代码输出如下:

    AAPL,Apple Inc.,1.76%,$143.39,$2.52,5/11,5/18
    GE,General Electric,3.32%,$28.91,$0.96,6/15,7/25
    XOM,Exxon Mobil,3.71%,$83.03,$3.08,5/10,6/9
    CVX,Chevron Corp,4.01%,$107.72,$4.32,5/17,6/12
    BP,BP PLC ADR,6.66%,$35.72,$2.38,5/10,6/23
    

    我做错了什么?谢谢你的帮助

    您可以使用选择器查找特定表:

    tables = soup.select("table:nth-of-type(3)")
    

    我不知道为什么您的结果的顺序与网页上的不同。

    您可以使用选择器查找特定的表:

    tables = soup.select("table:nth-of-type(3)")
    
    我不知道为什么你的结果的顺序与网页上的不同。

    虽然这个方法看起来更简洁,但这里有另一个选择,使用
    soup。查找所有的
    并保存到JSON(即使描述中没有)

    虽然这个方法看起来更简洁,但下面是另一个选择,使用
    soup.find_all
    并保存到JSON(尽管描述中没有)


    感谢@Barmar和@Delicious莴苣发布解决方案和代码。 关于输出的顺序,我意识到每当我刷新数据时,我都会看到数据按我拉的输出顺序一瞥。然后我看到排序后的数据。尝试了几种不同的方法,我能够使用SeleniumWebDriver来提取数据,就像呈现的web一样。谢谢大家

    BPT,BP Prudhoe Bay Royalty Trust,21.12%,$20.80,$4.39,4/11,4/20
    PER,Sandridge Permian Trust,18.06%,$2.88,$0.52,5/10,5/26
    CHKR,Chesapeake Granite Wash Trust,16.75%,$2.40,$0.40,5/18,6/1
    NAT,Nordic American Tankers,13.33%,$6.00,$0.80,5/18,6/8
    WIN,Windstream Corp,13.22%,$4.54,$0.60,6/28,7/17
    NYMT,New York Mortgage Trust Inc,12.14%,$6.59,$0.80,6/22,7/25
    IEP,Icahn Enterprises L.P.,11.65%,$51.50,$6.00,5/11,6/14
    FTR,Frontier Communications,11.51%,$1.39,$0.16,6/13,6/30
    

    感谢@Barmar和@Delicious莴苣发布解决方案和代码。 关于输出的顺序,我意识到每当我刷新数据时,我都会看到数据按我拉的输出顺序一瞥。然后我看到排序后的数据。尝试了几种不同的方法,我能够使用SeleniumWebDriver来提取数据,就像呈现的web一样。谢谢大家

    BPT,BP Prudhoe Bay Royalty Trust,21.12%,$20.80,$4.39,4/11,4/20
    PER,Sandridge Permian Trust,18.06%,$2.88,$0.52,5/10,5/26
    CHKR,Chesapeake Granite Wash Trust,16.75%,$2.40,$0.40,5/18,6/1
    NAT,Nordic American Tankers,13.33%,$6.00,$0.80,5/18,6/8
    WIN,Windstream Corp,13.22%,$4.54,$0.60,6/28,7/17
    NYMT,New York Mortgage Trust Inc,12.14%,$6.59,$0.80,6/22,7/25
    IEP,Icahn Enterprises L.P.,11.65%,$51.50,$6.00,5/11,6/14
    FTR,Frontier Communications,11.51%,$1.39,$0.16,6/13,6/30
    

    请给你的问题一个标题,更具体地描述它。这里的大多数问题都是关于无法按预期工作的代码。@Barmar感谢您指出。下次我会更加小心。@fuzzyForm看起来您是以类似CSV的格式保存它们,但有3家公司的名称中带有逗号,因此您可能希望将公司名称放在双引号内
    Qualcomm,Inc
    Banco Santander,S.A.
    Activision Blizzard,Inc.
    @Delirious你说得对。我会修好那部分。谢谢。请给你的问题一个标题,更具体地描述它。这里的大多数问题都是关于无法按预期工作的代码。@Barmar感谢您指出。下次我会更加小心。@fuzzyForm看起来您是以类似CSV的格式保存它们,但有3家公司的名称中带有逗号,因此您可能希望将公司名称放在双引号内
    Qualcomm,Inc
    Banco Santander,S.A.
    Activision Blizzard,Inc.
    @Delirious你说得对。我会修好那部分。谢谢,谢谢你编写代码。用不同的方法解决问题总是好的。我还不能让它在我的windows机器上工作。需要一点研究。如果我搞不清楚,我会寻求帮助。再次感谢,没问题。我确实使用了“lxml”作为HTML解析器(因为我已经安装了它)。如果这是问题所在,您可以尝试安装它或将其更改回最初使用的HTML解析器。是的,使用不同的解析器,一切都正常。谢谢,谢谢你编写代码。用不同的方法解决问题总是好的。我还不能让它在我的windows机器上工作。需要一点研究。如果我搞不清楚,我会寻求帮助。再次感谢,没问题。我确实使用了“lxml”作为HTML解析器(因为我已经安装了它)。如果这是问题所在,您可以尝试安装它或将其更改回最初使用的HTML解析器。是的,使用不同的解析器,一切都正常。谢谢