table = soup.findAll("div", {"class" : "iw_component","id":"c1417094965154"})
В приведенной выше строке findAll()
возвращает список.Итак, в следующей строке вы получаете сообщение об ошибке, поскольку оно ожидает строку HTML.
Если вы ожидаете только одну таблицу, попробуйте использовать следующий код.Просто замените
rows = table.find_all('span',recursive=False)
на
rows = table[0].find_all('span')
Если вы ожидаете, что на странице будет несколько таблиц, запустите цикл для таблицы изатем выполните остальные операторы внутри цикла for.
Кроме того, для красивого вывода вы можете заменить tabs
пробелами, как в следующем коде:
row = row.get_text()
row = row.replace('\t', '')
print(row)
Finalрабочий код для вас:
from bs4 import BeautifulSoup
import urllib2
url1 = "url"
content1 = urllib2.urlopen(url1).read()
soup = BeautifulSoup(content1,"lxml")
table = soup.findAll("div", {"class" : "iw_component","id":"c1417094965154"})
rows = table[0].find_all('span')
for row in rows:
row_str = row.get_text()
row_str = row_str.replace('\t', '')
print(row_str)
Относительно параметра recursive=False
, если он установлен в false, он найдет только у прямых потомков, которые в вашем случае не дадут результата.
Рекурсивный аргумент в find ()
Если вы хотите, чтобы Beautiful Soup рассматривал только прямых детей, вы можете передать recursive=False