BeautifulSoup找不到父节点

3 投票
1 回答
2253 浏览
提问于 2025-04-17 17:37

我真的搞不明白这个问题。我用BeautifulSoup解析了这个链接,然后我做了如下操作:

soup.find(text='Title').find_parent('h3')

但是它什么都找不到。如果你查看一下这个链接页面的代码,你会看到一个h3标签,里面有个词是Titles。具体来说是:

<h3 class="findSectionHeader"><a name="tt"></a>Titles</h3>

如果我让BeautifulSoup只解析上面那一行,它就能正常工作。我还尝试了:

soup.find(text='Title').find_parents('h3')
soup.find(text='Title').find_parent(class_='findSectionHeader')

这两种方法在只解析那一行时都能正常工作,但在整个html中却不行。

如果我用soup.find(text='Titles').find_parents('div'),它在整个html中就能正常工作。

1 个回答

1

findSectionHeader 的 H3 标签之前,还有一个带有 Title 的标签:

>>> soup.find(text='Title').parent
<a href="/find?q=batman&amp;s=tt&amp;ref_=fn_tt">Title</a>

你需要在搜索时更具体一些,改为搜索 Titles,然后循环查找正确的:

>>> soup.find(text='Titles').parent
<option value="tt">Titles</option>
>>> for elem in soup.find_all(text='Titles'):
...     parent_h3 = elem.find_parent('h3')
...     if parent_h3 is None:
...         continue
...     print parent_h3
... 
<h3 class="findSectionHeader"><a name="tt"></a>Titles</h3>

find(text='...') 只会匹配 完整 的文本,而不是部分匹配。如果你需要部分匹配,可以使用正则表达式:

>>> import re
>>> soup.find_all(text='Title')
[u'Title']
>>> soup.find_all(text=re.compile('Title'))
[u'Titles', u'Titles', u'Titles', u'Title', u'Advanced Title Search']

撰写回答