如何从BeautifulSoup中的表格td获取价值?

yak*_*yak 8 python beautifulsoup

我有一个页面,其源代码中包含一些表:

<table width='100%' cellspacing='0' cellpadding='2' class='an'>
    <tr>
        <td width='35%' align='right'>XXX :</td>
        <td><b>20</b></td>
    </tr>
    <tr><
        td align='right'>XXX :</td>
        <td><b>XXX</b></td>
    </tr>
    <tr>
        <td align='right'>XX :</td>
        <td><b>XXX</b></td>
    </tr>
    <tr>
        <td align='right'>XXX :</td>
        <td><b>XXX</b></td>
    </tr>
    <tr>
        <td align='right'>XXX :</td>
        <td><b>XXX</b></td>
    </tr>
    <tr>
        <td align='right'>XXX :</td>
        <td><b>XXX</b></td>
    </tr>
    <tr>
        <td align='right'>XXX :</td>
        <td><b>XXX</b></td>
    </tr>
</table>

<table width='361' cellspacing='0' cellpadding='2' class='an'>
    <tr>
        <td width='35%' align='right'>XXX :</td>
        <td><b>XXX</b></td>
    </tr>
    <tr>
        <td align='right'>XXX :</td>
        <td><b>XXX</b></td>
    </tr>
    <tr>
        <td align='right'>XXX :</td>
        <td><b>XXX</b></td>
    </tr>
    <tr>
        <td align='right'>XXX :</td>
        <td><b>XXX</b></td>
    </tr>
    <tr>
        <td align='right'>XX :</td>
        <td><a href='XXX'><b>XXX</b></a></td>
    </tr>
    <tr>
        <td align='right'>PHONE :</td>
        <td><b>518878943</b></td>
    </tr>
</table>
Run Code Online (Sandbox Code Playgroud)

我想从这个页面得到第二个表中的电话号码:

<td align='right'>PHONE :</td>
<td><b>518878943</b></td>
Run Code Online (Sandbox Code Playgroud)

但是,我的代码:

page_src="""<table width='100%' cellspacing='0' cellpadding='2' class='an'>
    <tr>
        <td width='35%' align='right'>XXX :</td>
        <td><b>20</b></td>
    </tr>
    <tr><
        td align='right'>XXX :</td>
        <td><b>XXX</b></td>
    </tr>
    <tr>
        <td align='right'>XX :</td>
        <td><b>XXX</b></td>
    </tr>
    <tr>
        <td align='right'>XXX :</td>
        <td><b>XXX</b></td>
    </tr>
    <tr>
        <td align='right'>XXX :</td>
        <td><b>XXX</b></td>
    </tr>
    <tr>
        <td align='right'>XXX :</td>
        <td><b>XXX</b></td>
    </tr>
    <tr>
        <td align='right'>XXX :</td>
        <td><b>XXX</b></td>
    </tr>
</table>

<table width='361' cellspacing='0' cellpadding='2' class='an'>
    <tr>
        <td width='35%' align='right'>XXX :</td>
        <td><b>XXX</b></td>
    </tr>
    <tr>
        <td align='right'>XXX :</td>
        <td><b>XXX</b></td>
    </tr>
    <tr>
        <td align='right'>XXX :</td>
        <td><b>XXX</b></td>
    </tr>
    <tr>
        <td align='right'>XXX :</td>
        <td><b>XXX</b></td>
    </tr>
    <tr>
        <td align='right'>XX :</td>
        <td><a href='XXX'><b>XXX</b></a></td>
    </tr>
    <tr>
        <td align='right'>PHONE :</td>
        <td><b>518878943</b></td>
    </tr>
</table>
"""

soup = BeautifulSoup(page_src, 'html.parser')
divs = soup.findAll("table", {"class": "an"})
for div in divs:
    row = ''
    rows = [row in div.findAll('tbody').findAll('tr')]
Run Code Online (Sandbox Code Playgroud)

给我这样一条错误信息:

Traceback (most recent call last):
  File "test.py", line 198, in <module>
    rows = [row in div.findAll('tbody').findAll('tr')]
AttributeError: 'ResultSet' object has no attribute 'findAll'
Run Code Online (Sandbox Code Playgroud)

如何解决这个问题并从页面获取电话号码?谢谢

编辑:

部分解决了.部分原因是因为我认为我的解决方案很丑陋,但有效.也许有人会想出更漂亮的解决方案?

tds = []
soup = BeautifulSoup(page_src, 'html.parser')
divs = soup.findAll("table", {"class": "an"})
for div in divs:
    rows = div.findAll('tr')
    for row in rows :
        tds.append(row.findAll('td'))
phone = str(tds[12][1])
phone = phone.replace("<td><b>", "").replace("</b></td>", "").strip()
print phone
Run Code Online (Sandbox Code Playgroud)

ale*_*cxe 12

找到td包含的元素PHONE :,然后获取以下兄弟元素.一条线:

soup.find("td", text="PHONE :").find_next_sibling("td").text
Run Code Online (Sandbox Code Playgroud)


dst*_*eba 5

您的代码有几个问题。

divs = soup.findAll("table", {"class": "an"})  
for div in divs:
    row = ''
    rows = [row in div.findAll('tbody').findAll('tr')]
Run Code Online (Sandbox Code Playgroud)

第一个问题是没有tbody标签,所以div.findAll('tbody')不会返回任何内容。

第二个问题是它div.findAll('tbody')会返回一个数组,而不是一个标签,所以你不能调用findAll('tr')它。

这是您想要获取tr表中所有标签的内容:

divs = soup.findAll("table", {"class": "an"})  
for div in divs:
    row = ''
    rows = div.findAll('tr')
Run Code Online (Sandbox Code Playgroud)

然后,您可以浏览所有tr标签并调用.text以获取行内的文本,并且其中包含“PHONE”的就是您想要的。

soup = BeautifulSoup(page_src, 'html.parser')
divs = soup.findAll("table", {"class": "an"})
for div in divs:
    row = ''
    rows = div.findAll('tr')
    for row in rows:
        if(row.text.find("PHONE") > -1):
            print(row.text)
Run Code Online (Sandbox Code Playgroud)

产生:

PHONE :
518878943
Run Code Online (Sandbox Code Playgroud)