【发布时间】:2017-04-21 08:06:25
【问题描述】:
我使用 python 模块 BeautifulSoup 编写了一个脚本来从网页获取 xml。此网页包含描述使用基因组数据的项目的信息,我想提取所有 PUBMED ID(来自该项目的出版物的唯一 ID 号)。每个 PUBMED ID 都是一个 8 位数字。
我尝试了两种不同的方法来提取 PUBMED ID,但两者都存在问题。首先,我使用这段代码来提取完整的 xml:
url = 'http://www.ebi.ac.uk/ena/data/view/PRJEB2357&display=xml'
project_page = urlopen(url)
soup = BeautifulSoup(project_page, "html.parser")
print soup
这个命令的输出有点像这样:
<db>PUBMED</db>
<id>25101644</id>
</xref_link>
</project_link>
<project_link>
<xref_link>
<db>PUBMED</db>
<id>24509479</id>
(显然这不是 xml 的全部内容,只是与我相关的部分)。
BeautifulSoup 模块包含许多命令,这些命令在此汤中搜索感兴趣的文本,但据我所知,它们都将标签或正在搜索的文本作为输入。我不能在这里使用其中任何一个,因为此页面上除 PUBMED ID 之外的多个文本段具有相同的 xml 标签 (<id>),而且我显然无法使用文本搜索 PUBMED ID如果我不知道它是什么!
我尝试的第二种方法是使用以下代码仅打印 xml 中的文本:
url = 'http://www.ebi.ac.uk/ena/data/view/PRJEB2357&display=xml'
project_page = urlopen(url)
soup = BeautifulSoup(project_page, "html.parser")
text = soup.text
print text
这次的输出是这样的:
PUBMED
25101644
PUBMED
24509479
此时我有几个想法。首先,python re 模块(python 早期版本中的正则表达式)可用于搜索表达式,但我知道的所有 re 命令都需要至少一部分被搜索的模式作为输入,所以我不认为仅此一项是一种选择。其次,我尝试做这样的事情:
url = 'http://www.ebi.ac.uk/ena/data/view/PRJEB2357&display=xml'
project_page = urlopen(url)
soup2 = BeautifulSoup(project_page, "html.parser")
text = soup2.text
text = text.replace('\n', ' ').replace(' ', '') #removes all spaces and linebreaks
PMID = re.findall('PUBMED........', text, flags = 0)
print PMID
这给出了这个输出:
[u'PUBMED25101644', u'PUBMED24509479']
所以理论上这可以转换为一个字符串,我只是剪掉了相关的 8 位数字,但这变得非常 hacky,我想在网页上多次运行这个脚本,用于数千个项目和数量每个项目的 PUBMED ID 会有所不同,因此这种方法不太适合自动化。
我想要的是一种搜索单词“PUBMED”的每个实例的方法,无论是在生汤中还是在文本中,并仅提取下一行的 PUBMED ID。有人对如何做到这一点有任何建议吗?
【问题讨论】:
标签: python regex xml web-scraping beautifulsoup