将 'list of lists' Wiki 页面组织成 table

Organising a 'list of lists' Wiki page into a table

我想将 https://en.wikipedia.org/wiki/List_of_trees_and_shrubs_by_taxonomic_family

列表列表维基百科页面中的数据解析为 table

我想创建一个 table 将每个包含 'family' 的副标题的第一个词链接到每个主要要点的第一个词,所以我对文本的大部分内容不感兴趣.

例如,我想要这样的输出:

    Araucariaceae   Agathis
    Araucariaceae   Araucaria
    Cupressaceae    Athrotaxis

对于这样的页面:[抱歉,我有足够的声誉 post Maths StackExchange 中的图片,但这里没有]

    Gymnosperms
    Conifers
    Araucariaceae: monkey-puzzle family
    Agathis – kauri conifers        
    Agathis australis – kauri pine; dammar
    Agathis lanceolata – red kauri
    Agathis robusta – Dundathu pine; Queensland kauri; smooth bark kauri
    Araucaria – monkey puzzle trees
    Araucaria angustifolia – Paraná pine
    Araucaria araucana – monkey-puzzle tree
    Araucaria bidwillii – bunya-bunya
    Araucaria columnaris – Cook pine
    Araucaria cunninghamii – Moreton Bay pine; hoop pine
    Araucaria heterophylla – Norfolk Island pine
    Araucaria hunsteinii – klinki
    Cupressaceae: cypress family
    Athrotaxis – Tasmanian cedars
    Athrotaxis cupressoides – pencil pine
    Athrotaxis selaginoides – King Billy pine

我查找了 wikipediaAPI 包,但没有找到任何具体内容。有没有类似的功能? 此外,我认为我无法使用 str 包以简洁的方式处理这么多原始文本。

有什么建议吗?

一种可靠的方法是使用页面源(通过编辑)并使用格式信息来解析它:

def do_it(epl):
    for line in epl:
        if ":" in line:
            top = line.split(":")[0][6:].strip("[]")
        elif line.startswith("*'''''"):
            print top, line.split()[0][8:].strip("[]'")
  • 家谱包含 semi-colon 并以 ====[[
  • 开头
  • 下面是*'''''
  • 开头的
  • 去除所有多余的格式字符

取页面编辑文字:

====[[Podocarpaceae]]: podocarp family====
----
*'''''[[Afrocarpus]]''''' '''– African podocarps'''
**''[[Afrocarpus gracilior]]'' – musengera; zigba
*'''''[[Dacrycarpus]]''''' 
**''[[Dacrycarpus dacrydioides]]'' – kahikatea
*'''''[[Dacrydium]]''''' 
**''[[Dacrydium cupressinum]]'' – rimu
*'''''[[Podocarpus]]''''' '''– Australasian podocarps'''
**''[[Podocarpus gracilior]]'' – fern pine
**''[[Podocarpus henkelii]]'' – long-leafed yellowwood
**''[[Podocarpus macrophyllus]]'' – kusamaki; inumaki
**''[[Podocarpus neriifolius]]'' – oleander-leaf podocarp

并输出

Podocarpaceae Afrocarpus
Podocarpaceae Dacrycarpus
Podocarpaceae Dacrydium
Podocarpaceae Podocarpus

这里是美汤的做法:

首先我们将我们想要的文本拉入列表

url='https://en.wikipedia.org/wiki/List_of_trees_and_shrubs_by_taxonomic_family'
r = requests.get(url).text
soup = BeautifulSoup(r, 'html.parser')

tree = []
for text in soup.find_all(['h4', 'b']):
    tree.append(text.text)

然后我们做一些基本的 df 操作,按照我们想要的方式清理它。

df = pd.DataFrame(tree)
df = df[~df[0].str.contains('–')]
df[1] = df.loc[df[0].str.contains('edit')]
df[1] = df[1].ffill()
df = df[df[0]!=df[1]].reset_index(drop = True).copy()
df[1] = df[1].str.replace(":.*","", regex = True)

df.head()

        0             1
0   Agathis     Araucariaceae
1   Araucaria   Araucariaceae
2   Athrotaxis  Cupressaceae
3   Callitris   Cupressaceae
4   Calocedrus  Cupressaceae