Python web刮取多个标签内的文本

时间:2014-01-09 20:45:12

标签: python python-3.x web-scraping beautifulsoup yahoo-finance

我想在雅虎财务页面中返回一些值。它们包含在标签中。我能够让它返回这些值

543.46
546.8
None
None
595.73
0.65

我遇到了无法获得的值。我应该返回“537.51 x 100”和“537.60 x 100”由于网站的原因,这些数字确实会发生变化。我只需要那种格式作为输出。我从源页面看到的特定html如下所示。此代码位于更多标记内,但BeautifulSoup并不关心。

<tr>
<th scope="row" width="48%">
    Prev Close:</th>
<td class="yfnc_tabledata1">
    543.46</td>
</tr>

<tr>
<th scope="row" width="48%">
    Open:</th>
<td class="yfnc_tabledata1">
    546.80</td>
</tr>

<tr>
<th scope="row" width="48%">
    Bid:</th>
<td class="yfnc_tabledata1">
    <span id="yfs_b00_aapl">
        536.55</span>
    <small> x 
        <span id="yfs_b60_aapl">
            100</span>
    </small>
</td>
</tr>

<tr><
th scope="row" width="48%">
    Ask:</th>
<td class="yfnc_tabledata1">
    <span id="yfs_a00_aapl">
        536.63</span>
    <small> x 
        <span id="yfs_a50_aapl">
            100</span>
    </small>
</td>
</tr>

<tr>
<th scope="row" width="48%">
    1y Target Est:</th>
<td class="yfnc_tabledata1">
    595.73</td>
</tr>

<tr>
<th scope="row" width="48%">
    Beta:</th>
<td class="yfnc_tabledata1">
    0.65</td>
</tr>

正如您所看到的,第三个和第四个值有一些额外的标签,例如和td标签内部,所以它返回None,我不想要。我的代码在这里:

from urllib.request import urlopen
from bs4 import BeautifulSoup

html = urlopen("http://finance.yahoo.com/q?s=AAPL&q1=1")
soup = BeautifulSoup(html)


for data in soup.find_all('td', attrs = {'class': 'yfnc_tabledata1'} ) [0:6]:
        print (data.string) #I have .string so it wouldn't print the tags, only the text. I would rather have it return strings before it needs to print. 

我认为我需要在第一个内部使用另一个for循环来解释额外的标签或if语句。我不确定编码会是什么样的。

2 个答案:

答案 0 :(得分:2)

就个人而言,我会为此做一个非常棒的方式:

from urllib2 import urlopen
from bs4 import BeautifulSoup

html = urlopen("http://finance.yahoo.com/q?s=AAPL&q1=1")
soup = BeautifulSoup(html)

for data in soup.find_all('td', class_="yfnc_tabledata1")[0:6]:
    if data.parent.name == "tr":
            print (data.text)

输出:

>>>
543.46
546.80
536.50 x 100
536.60 x 100
595.73
0.65
>>> 

工作得很好:))

注意:我为urlopen函数更改为urllib2。

您还可以使用以下任一项:

for data in soup.find_all('td', class_="yfnc_tabledata1")[0:6]:
    print (data.text)

for data in soup.find_all('td', attrs={'class': 'yfnc_tabledata1'})[0:6]:
    print (data.text)

答案 1 :(得分:1)

最短的答案是,在bs4中,他们添加了.strings

您的代码可能类似于:

for data in soup.find_all('td', attrs={'class': 'yfnc_tabledata1'})[0:6]:
    print '--> ',(''.join(data.strings))

保留“\ n”字符,以便您可以根据自己的喜好去除和重新组合字符串。