我写了以下代码行
#!/usr/bin/python
#weather.scrapper
from bs4 import BeautifulSoup
import urllib
def main():
"""weather scrapper"""
r = urllib.urlopen("https://www.wunderground.com/history/airport/KPHL/2016/1/1/MonthlyHistory.html?&reqdb.zip=&reqdb.magic=&reqdb.wmo=&MR=1").read()
soup = BeautifulSoup(r, "html.parser")
table = soup.find_all("table", class_="responsive airport-history-summary-table")
tr = soup.find_all("tr")
td = soup.find_all("td")
print table
if __name__ == "__main__":
main()
当我打印表格时,我也得到了所有的html(td,tr,span等)。如何在不使用html的情况下打印表格(tr,td)的内容? 谢谢!
答案 0 :(得分:1)
当您想要获取内容时,必须使用.getText()
方法。由于find_all
会返回元素列表,因此您必须选择其中一个元素(td[0]
)。
或者你可以这样做:
for tr in soup.find_all("tr"):
print '>>>> NEW row <<<<'
print '|'.join([x.getText() for x in tr.find_all('td')])
上面的循环打印单元格旁边的每个行单元格。
请注意,您确实找到了所有td
和所有tr
,但您可能只希望获得table
中的{。}}。
如果你想在table
中寻找元素,你必须这样做:
table.find('tr')
代替soup.find('tr)
,因此BeautifulSoup
将在tr
而不是整个table
中寻找html
。
您修改的代码(根据您的评论表示还有更多表格):
#!/usr/bin/python
#weather.scraper
from bs4 import BeautifulSoup
import urllib
def main():
"""weather scraper"""
r = urllib.urlopen("https://www.wunderground.com/history/airport/KPHL/2016/1/1/MonthlyHistory.html?&reqdb.zip=&reqdb.magic=&reqdb.wmo=&MR=1").read()
soup = BeautifulSoup(r, "html.parser")
tables = soup.find_all("table")
for table in tables:
print '>>>>>>> NEW TABLE <<<<<<<<<'
trs = table.find_all("tr")
for tr in trs:
# for each row of current table, write it using | between cells
print '|'.join([x.get_text().replace('\n','') for x in tr.find_all('td')])
if __name__ == "__main__":
main()