0

I have the following input file.

<td align="right">
 <img alt="inflation rates india" src="http://www.inflation.eu/images/country_icons/round_icons_36/india.jpg">
 </img></td>,
 <td align="right" style="width:20%;">inflation</td>,
 <td align="right" style="width:20%;">inflation </td>,
 <td align="right">-0.69 %</td>,
 <td align="right">4.00 % </td>,
 <td align="right">0.35 %</td>,
 <td align="right">3.97 % </td>,
 <td align="right">0.70 %</td>,
 <td align="right">3.24 % </td>,
 <td align="right">0.00 %</td>,
 <td align="right">2.89 % </td>,
 <td align="right">0.00 %</td>,
 <td align="right">2.52 % </td>,
 <td align="right">1.79 %</td>,
 <td align="right">1.79 % </td>,
 <td align="right">0.72 %</td>,
 <td align="right">1.08 % </td>,
 <td align="right">0.36 %</td>,
 <td align="right">1.09 % </td>,
 <td align="right">0.73 %</td>,
 <td align="right">2.21 % </td>,
 <td align="right">0.36 %</td>,
 <td align="right">2.61 % </td>,
 <td align="right">0.00 %</td>,
 <td align="right">2.62 % </td>,
 <td align="right">-0.36 %</td>,
 <td align="right">1.86 % </td>,
 <td align="right">
 <a class="footer" href="http://www.inflation.eu/" target="blank">inflation.eu</a> is an initiative of Triami Media BV in cooperation with <a class="footer" href="http://www.homefinance.nl/" target="blank">HomeFinance</a> - © 2010 - 2018 Copyright 
 </td>

My Python code is

table = page_soup.findAll('td',{"align":"right"})

list_of_rows = []
for row in table.find_all('tr'):
    list_of_cells = []
    for cell in table.findAll('td'):
        list_of_cells.append(cell.text)
    list_of_rows.append(list_of_cells)

I want all the td values that are followed by percentage. Previously I tried with find_all function but it is giving error.

AttributeError: 'ResultSet' object has no attribute 'find_all'
metatoaster
  • 17,419
  • 5
  • 55
  • 66
mayank9669
  • 1
  • 1
  • 2

3 Answers3

2
from bs4 import BeautifulSoup


d = """<table><tr><td align="right">
 <img alt="inflation rates india" src="http://www.inflation.eu/images/country_icons/round_icons_36/india.jpg">
 </img></td>,
 <td align="right" style="width:20%;">inflation</td>,
 <td align="right" style="width:20%;">inflation </td>,
 <td align="right">-0.69 %</td>,
 <td align="right">4.00 % </td>,
 <td align="right">0.35 %</td>,
 <td align="right">3.97 % </td>,
 <td align="right">0.70 %</td>,
 <td align="right">3.24 % </td>,
 <td align="right">0.00 %</td>,
 <td align="right">2.89 % </td>,
 <td align="right">0.00 %</td>,
 <td align="right">2.52 % </td>,
 <td align="right">1.79 %</td>,
 <td align="right">1.79 % </td>,
 <td align="right">0.72 %</td>,
 <td align="right">1.08 % </td>,
 <td align="right">0.36 %</td>,
 <td align="right">1.09 % </td>,
 <td align="right">0.73 %</td>,
 <td align="right">2.21 % </td>,
 <td align="right">0.36 %</td>,
 <td align="right">2.61 % </td>,
 <td align="right">0.00 %</td>,
 <td align="right">2.62 % </td>,
 <td align="right">-0.36 %</td>,
 <td align="right">1.86 % </td>,
 <td align="right">
 <a class="footer" href="http://www.inflation.eu/" target="blank">inflation.eu</a> is an initiative of Triami Media BV in cooperation with <a class="footer" href="http://www.homefinance.nl/" target="blank">HomeFinance</a> - © 2010 - 2018 Copyright 
 </td></tr></table>"""

soup = BeautifulSoup(d, "html.parser")
for tr in soup.findAll("table"):
     for td in tr.find_all("td"):
         if not td.attrs.get('style'):
             print td.text

Output:

-0.69 %
4.00 % 
0.35 %
3.97 % 
0.70 %
3.24 % 
0.00 %
2.89 % 
0.00 %
2.52 % 
1.79 %
1.79 % 
0.72 %
1.08 % 
0.36 %
1.09 % 
0.73 %
2.21 % 
0.36 %
2.61 % 
0.00 %
2.62 % 
-0.36 %
1.86 % 
Rakesh
  • 81,458
  • 17
  • 76
  • 113
0

If you simply want the td in the document, without regard of the table, you can simply do:

list_of_cells = []
for cell in page_soup.find_all('td'):
    text = cell.text.strip()
    if text.endswith('%'):
        list_of_cells.append(text)

As for the error message regarding table, the ResultSet is like a list - you have to use individual items within it, such as through a for-loop.

list_of_cells = []
for tab in table:
    for cell in tab.find_all('td'):
        text = cell.text.strip()
        if text.endswith('%'):
            list_of_cells.append(text)

Note that this may skip the top level tags.

metatoaster
  • 17,419
  • 5
  • 55
  • 66
  • thank you so much for your answer but it is giving output like '-0.69\xa0%', '4.00\xa0%', '0.70\xa0%', '3.24\xa0%', '0.00\xa0%', '2.52\xa0%', '0.72\xa0%', '1.08\xa0%', '0.73\xa0%', '2.21\xa0%', '0.00\xa0%', '2.62\xa0%' how can I remove \xa0% from this output – mayank9669 Feb 21 '18 at 07:30
  • Try this question: [Python: Removing \xa0 from string?](https://stackoverflow.com/questions/10993612/python-removing-xa0-from-string) – metatoaster Feb 21 '18 at 07:33
0

This is another way you can try as well to get the required output:

soup = BeautifulSoup(content,"lxml")
items = '\n'.join([item.text for item in soup.find_all("td") if "%" in item.text])
print(items)
SIM
  • 21,997
  • 5
  • 37
  • 109