Ada*_*tan 18 python beautifulsoup tabular web-scraping
我的当地机场不光彩地阻止没有IE的用户,看起来很糟糕.我想编写一个Python脚本,每隔几分钟就可以获取Arrival和Departures页面的内容,并以更易读的方式显示它们.
我选择的工具是机械化欺骗网站以相信我使用IE,而BeautifulSoup用于解析页面以获取航班数据表.
老实说,我迷失在BeautifulSoup文档中,无法理解如何从整个文档中获取表(我知道他的标题),以及如何从该表中获取行列表.
有任何想法吗?
Ofr*_*viv 36
这不是您需要的特定代码,只是演示如何使用BeautifulSoup.它找到id为"Table1"的表并获取其所有tr元素.
html = urllib2.urlopen(url).read()
bs = BeautifulSoup(html)
table = bs.find(lambda tag: tag.name=='table' and tag.has_attr('id') and tag['id']=="Table1")
rows = table.findAll(lambda tag: tag.name=='tr')
Run Code Online (Sandbox Code Playgroud)
gog*_*n13 11
soup = BeautifulSoup(HTML)
# the first argument to find tells it what tag to search for
# the second you can pass a dict of attr->value pairs to filter
# results that match the first tag
table = soup.find( "table", {"title":"TheTitle"} )
rows=list()
for row in table.findAll("tr"):
rows.append(row)
# now rows contains each tr in the table (as a BeautifulSoup object)
# and you can search them to pull out the times
Run Code Online (Sandbox Code Playgroud)
这是一个通用的工作示例<table>。(虽然由于加载表数据需要执行 javascript 而不使用您的页面)
从这里按国家/地区的 GDP(国内生产总值)提取表格数据。
htmltable = soup.find('table', { 'class' : 'table table-striped' })
# where the dictionary specify unique attributes for the 'table' tag
Run Code Online (Sandbox Code Playgroud)
波纹管函数解析以标签<table>开头的 html 段,后跟多个<tr>(表格行)和内部<td>(表格数据)标签。它返回带有内部列的行列表。<th>第一行只接受一个(表头/数据)。
def tableDataText(table):
"""Parses a html segment started with tag <table> followed
by multiple <tr> (table rows) and inner <td> (table data) tags.
It returns a list of rows with inner columns.
Accepts only one <th> (table header/data) in the first row.
"""
def rowgetDataText(tr, coltag='td'): # td (data) or th (header)
return [td.get_text(strip=True) for td in tr.find_all(coltag)]
rows = []
trs = table.find_all('tr')
headerow = rowgetDataText(trs[0], 'th')
if headerow: # if there is a header row include first
rows.append(headerow)
trs = trs[1:]
for tr in trs: # for every table row
rows.append(rowgetDataText(tr, 'td') ) # data row
return rows
Run Code Online (Sandbox Code Playgroud)
使用它我们得到(前两行)。
list_table = tableDataText(htmltable)
list_table[:2]
[['Rank',
'Name',
"GDP (IMF '19)",
"GDP (UN '16)",
'GDP Per Capita',
'2019 Population'],
['1',
'United States',
'21.41 trillion',
'18.62 trillion',
'$65,064',
'329,064,917']]
Run Code Online (Sandbox Code Playgroud)
这可以很容易地转换pandas.DataFrame为更高级的操作。
import pandas as pd
dftable = pd.DataFrame(list_table[1:], columns=list_table[0])
dftable.head(4)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
54591 次 |
| 最近记录: |