15

我有一些 html 代码,其中包含许多<table>s。

我正在尝试获取第二个表中的信息。有没有办法在不使用的情况下做到这一点soup.findAll('table')

当我使用soup.findAll('table')时,我得到一个错误:

ValueError: too many values to unpack

有没有办法在某些代码中获取第 n 个标签,或者不需要通过所有表的其他方式?或者我应该看看我是否可以在表格中添加标题?(喜欢<table title="things">

<h4>title</h4>如果有帮助,每个表格上方还有标题 ( )。

谢谢。

编辑

这是我问这个问题时的想法:

当有更多时,我将对象解压缩为两个值。我认为这只会给我列表中的前两件事,但当然,它一直给我上面提到的错误。我不知道返回值是一个列表,并认为它是一个特殊的对象或其他东西,我的代码是基于我朋友的。

我在想这个错误意味着页面上有太多的表格并且它不能处理所有的表格,所以我在寻求一种没有我正在使用的方法的方法来做到这一点。我可能应该停止假设事情。

现在我知道它返回一个列表,我可以在 for 循环中使用它或使用soup.findAll('table')[someNumber]. 我也了解了解包是什么以及如何使用它。感谢所有帮助过的人。

希望这可以解决问题,既然我知道我在做什么,我的问题比我问它时的意义要小,所以我想我只是在这里写下我的想法。

编辑2:

这个问题现在已经很老了,但我仍然看到我从来没有真正清楚自己在做什么。

如果它对任何人有帮助,我试图解开findAll(...)结果,其中的数量我不知道。

useless_table, table_i_want, another_useless_table = soup.findAll("table");

由于页面中并不总是有我猜到的表格数量,并且元组中的所有值都需要解包,所以我收到了ValueError

ValueError: too many values to unpack

因此,我一直在寻找方法来获取返回的元组中的第二个(或任何一个索引)表,而不会遇到有关使用了多少表的错误。

4

3 回答 3

30

要从 call 中获取第二个表,请将soup.findAll('table')其用作列表,只需对其进行索引:

secondtable = soup.findAll('table')[1]
于 2012-12-30T22:58:31.783 回答
2

Martjin Pieter 的回答将使它确实有效。我有一些使用嵌套table标签的经验,当我只是简单地获取列表中的第二个表而不注意时,它破坏了我的代码。

当您尝试find_all获取第 n 个元素时,您可能会搞砸,您最好找到您想要的第一个元素,并确保第 n 个元素实际上是该元素的兄弟而不是子元素。

  1. 您可以使用find_next_sibling()来保护您的代码
  2. 您可以先找到父母,然后使用 find_all(recursive=False) 来保证您的搜索范围。

以防万一你需要它。我将在下面列出我的代码(使用 recursive=FALSE)。

import urllib2
from bs4 import BeautifulSoup

text = """
<html>
    <head>
    </head>
    <body>
        <table>
            <p>Table1</p>
            <table>
                <p>Extra Table</p>
            </table>
        </table>
        <table>
            <p>Table2</p>
        </table>
    </body>
</html>
"""

soup = BeautifulSoup(text)

tables = soup.find('body').find_all('table')
print len(tables)
print tables[1].text.strip()
#3
#Extra Table # which is not the table you want without warning

tables = soup.find('body').find_all('table', recursive=False)
print len(tables)
print tables[1].text.strip()
#2
#Table2 # your desired output
于 2013-11-03T17:13:48.727 回答
0

这是我的版本

# Import bs4
from bs4 import BeautifulSoup

# Read your HTML
#html_doc = your html

# Get BS4 object
soup = BeautifulSoup(html_doc, "lxml")

# Find next Sibling Table to H3 Header with text "THE GOOD STUFF"    
the_good_table = soup.find(name='h3', text='THE GOOD STUFF').find_next_sibling(name='table')

# Find Second tr in your table
your_tr = the_good_table.findAll(name='tr')[1]

# Find Text Value of First td in your tr
your_string = your_tr.td.text

print(your_string)

输出:

'I WANT THIS STRING'
于 2018-08-20T18:37:38.473 回答