Python 使用BeautifulSoup查找嵌套标记的原始位置

Python 使用BeautifulSoup查找嵌套标记的原始位置,python,beautifulsoup,Python,Beautifulsoup,我试图从XML文本中提取一组标记,并确定它们在“呈现”文本中的位置 例如: XML: 此代码无法在第二个外部参照上找到,因为紧靠它前面的文本是上一个外部参照标记的一部分 有什么建议吗?好吧,没有人回应,所以我只好即兴发挥。这是我目前的方法: lens = [len(tag.string) for tag in p.contents] clens = [sum(lens[:ind]) for ind in xrange(1,len(lens))] locs = [spot for tag, spo

我试图从XML文本中提取一组标记,并确定它们在“呈现”文本中的位置

例如:

XML:

此代码无法在第二个外部参照上找到,因为紧靠它前面的文本是上一个外部参照标记的一部分


有什么建议吗?

好吧,没有人回应,所以我只好即兴发挥。这是我目前的方法:

lens = [len(tag.string) for tag in p.contents]
clens = [sum(lens[:ind]) for ind in xrange(1,len(lens))]
locs = [spot for tag, spot in zip(p.contents, clens) if isinstance(tag, Tag) and tag.name == 'xref']
基本思想是使用
string
方法返回渲染文本。我用它来确定段落中每个子段落的长度。然后我使用这些长度来确定我要查找的标记的位置

希望这能帮助别人


-威尔

嗯,没有人回应,所以我只好即兴发挥。这是我目前的方法:

lens = [len(tag.string) for tag in p.contents]
clens = [sum(lens[:ind]) for ind in xrange(1,len(lens))]
locs = [spot for tag, spot in zip(p.contents, clens) if isinstance(tag, Tag) and tag.name == 'xref']
基本思想是使用
string
方法返回渲染文本。我用它来确定段落中每个子段落的长度。然后我使用这些长度来确定我要查找的标记的位置

希望这能帮助别人


-威尔

这是一次美丽的集体静默吗?BeautifulSoup使用
findAll
而不是
find\u all
这似乎是将BeautifulSoup(可能)和文本以一种不可比拟的方式混合在一起
p.findAll('xref')
似乎工作正常。我正在使用
bs4
,这是一种新的BeautifulSoup解析器,它使用
find\u all
而不是
findAll
。此外,我提取标记也没有问题,我很难找到它们在呈现文本中的位置。明白了,我无法重现您的错误,但我的sent_tokenize可能会返回不同的结果(配置内容)。此外,还有多个
find
,因此很难判断错误在哪里(rawtext.find或s.find)。它不会出错,而是生成错误的结果。id为“pone.0012598-Quinn1”的外部参照上游20个字符的文本不在渲染文本中(因为它们是前面标记的一部分),因此无法使用文本搜索找到它们。所以我希望有一种方法可以使用BeautifulSoup来检索标记在渲染文本中的位置,这样我就不必依赖文本搜索。BeautifulSoup rocks,但我不知道它会这样做。我将观看这条线索,希望了解它是否有。我知道这可以在[Genshi]中完成,因为Genshi流携带每个类似SAX的事件的位置信息,用于调试目的。您可以计算文本事件的len,以了解“rendered”中的位置文本。不是你要求的,但这是一个可以完成工作的工具。这是一个BeautifulSoup静止器吗?BeautifulSoup使用
findAll
Not
find\u all
这似乎是将BeautifulSoup(可能)和文本以一种无与伦比的方式混合在一起。
p.findAll('xref')
似乎工作正常。我正在使用
bs4
,这是一种新的BeautifulSoup解析器,它使用
find\u all
而不是
findAll
。此外,我提取标记没有问题,在呈现的文本中找到它们的位置是我遇到困难的。明白了,我无法重现您的错误,但我的sent\u标记化可以重新执行ning不同的结果(配置内容)。此外,还有多个
find
,因此很难判断错误在哪里(rawtext.find或s.find)。它不会出错,而是生成不正确的结果。id为“pone.0012598-Quinn1”的外部参照上游20个字符的文本不在渲染文本中(因为它们是前面标记的一部分)因此,使用文本搜索无法找到它们。因此,我希望有一种方法可以使用BeautifulSoup检索标记在渲染文本中的位置,这样我就不必依赖文本搜索。BeautifulSoup rocks但我不知道它会这样做。我将观看此线程,希望了解它是否会这样做。我确实知道它可以在[Genshi][作为Genshi流,每个SAX类事件都带有位置信息,用于调试目的。您可以计算文本事件的长度,以了解“呈现”文本中的位置。这不是您要求的,但这是一个可以完成任务的工具。
lens = [len(tag.string) for tag in p.contents]
clens = [sum(lens[:ind]) for ind in xrange(1,len(lens))]
locs = [spot for tag, spot in zip(p.contents, clens) if isinstance(tag, Tag) and tag.name == 'xref']