我使用 BeautifulSoup 制作了一个脚本来从网络中提取某些信息。唯一的问题是我不知道如何将结果转换为字典,如果我这样做,代码就会像意大利面条一样。我不确定我写的这段代码是否可以被接受为Pythonic。最后一项 Species
应该是二项式命名法,如“Lycaon pictus”,而“pictus”后面的字符串应被忽略。需要一些帮助。
脚本
from urllib.request import Request, urlopen
from bs4 import BeautifulSoup
import re
url = "https://www.itis.gov/servlet/SingleRpt/SingleRpt?search_topic=TSN&search_value=183833#null"
page = urlopen(Request(url, headers={'User-Agent': 'Mozilla/5.0'}))
soup = BeautifulSoup(page, 'html.parser')
results = soup.findAll('tr')
for result in results:
text = result.get_text().strip()
pattern = r"^(Kingdom|Phylum|Division|Class|Order|Family|Genus|Species)[\w]+"
if re.match(pattern, text):
res = text.split('\n', 1)[0].strip()
print(res)
<小时/>
脚本的输出
KingdomAnimalia
PhylumChordata
ClassMammalia Linnaeus, 1758
OrderCarnivora Bowdich, 1821
FamilyCanidae Fischer, 1817
GenusLycaon Brookes, 1827
SpeciesLycaon pictus (Temminck, 1820) – African hunting dog, African Wild Dog, Painted Hunting Dog
<小时/>
预期结果
{
'Kingdom': 'Animalia',
'Phylum': 'Chordata',
'Class': 'Mammalia',
'Order': 'Carnivora',
'Family': 'Canidae',
'Genus': 'Lycaon',
'Species': 'Lycaon pictus'
}
最佳答案
对于给出的具体示例,这有效:
...
results = soup.findAll('tr')
my_dict = {}
for result in results:
text = result.get_text().strip()
pattern = r"^(Kingdom|Phylum|Division|Class|Order|Family|Genus|Species)[\w]+"
if re.match(pattern, text):
res = text.split('\n', 1)[0].strip()
pieces = re.findall(r'[A-Z][ a-z]*', res)
my_dict[pieces[0]] = pieces[1]
print(my_dict)
输出:
{'Kingdom': 'Animalia', 'Phylum': 'Chordata', 'Class': 'Mammalia',
'Order': 'Carnivora', 'Family': 'Canidae', 'Genus': 'Lycaon',
'Species': 'Lycaon pictus'}
这在很大程度上依赖于上例中给出的确切格式。例如,如果网站有 'Lycaon Pictus'
,'Species'
的大写字母为 'P'
,则 'Species'
中的相应条目字典将只是 'Lycaon'
而不是 'Lycaon Pictus'
。
关于Python,BeautifulSoup,重新: How to convert extracted texts to dictionary from web?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50621172/