Python 查找元素的直接子元素

Python 查找元素的直接子元素,python,html,dom,web-scraping,beautifulsoup,Python,Html,Dom,Web Scraping,Beautifulsoup,我正在编写一个用Python测试现象的解决方案。我已经完成了大部分逻辑,但在维基百科文章中的链接之后,会出现许多边缘案例 我遇到的问题出现在这样一个页面上,第一个有多个级别的子元素,而第一个),您必须跳过括号,然后转到下一个锚标记/href。在大多数文章中,我的算法可以跳过括号,但由于它在括号前面查找链接(或者如果它们不存在)的方式,它在错误的位置查找锚标记。具体来说,这里: 该算法的工作原理是迭代第一段标记中的元素(在本文的主体部分),迭代地对每个元素进行字符串化,然后首先检查它是否包含“(”

我正在编写一个用Python测试现象的解决方案。我已经完成了大部分逻辑,但在维基百科文章中的链接之后,会出现许多边缘案例

我遇到的问题出现在这样一个页面上,第一个
有多个级别的子元素,而第一个
),您必须跳过括号,然后转到下一个锚标记/href。在大多数文章中,我的算法可以跳过括号,但由于它在括号前面查找链接(或者如果它们不存在)的方式,它在错误的位置查找锚标记。具体来说,这里:

该算法的工作原理是迭代第一段标记中的元素(在本文的主体部分),迭代地对每个元素进行字符串化,然后首先检查它是否包含“(”或“) 是否有直截了当的方法避免嵌入锚定标记,只获取第一个链接的直接子链接?

以下是带有此代码的函数,以供参考:

**def getValidLink(self, currResponse):
        currRoot = BeautifulSoup(currResponse.text,"lxml")
        temp = currRoot.body.findAll('p')[0]
        parenOpened = False
        parenCompleted = False
        openCount = 0
        foundParen = False
        while temp.next:
            temp = temp.next
            curr = str(temp)
            if '(' in curr and str(type(temp)) == "<class 'bs4.element.NavigableString'>":
                foundParen = True
                break
            if '<a' in curr and str(type(temp)) == "<class 'bs4.element.Tag'>":
                link = temp
                break

        temp = currRoot.body.findAll('p')[0]
        if foundParen:
            while temp.next and not parenCompleted:
                temp = temp.next
                curr = str(temp)
                if '(' in curr:
                    openCount += 1
                    if parenOpened is False:
                        parenOpened = True
                if ')' in curr and parenOpened and openCount > 1:
                    openCount -= 1
                elif ')' in curr and parenOpened and openCount == 1:
                    parenCompleted = True
            try:
                return temp.findNext('a').attrs['href']
            except KeyError:
                print "\nReached article with no main body!\n"
                return None
        try:
            return str(link.attrs['href'])
        except KeyError:
            print "\nReached article with no main body\n"
            return None**
**def getValidLink(自身、当前响应):
currRoot=BeautifulSoup(currResponse.text,“lxml”)
temp=currRoot.body.findAll('p')[0]
parenOpened=False
parenCompleted=False
openCount=0
foundParen=False
而临时下一步:
温度=下一个温度
电流=str(温度)
如果当前和str中的“(”类型(临时))=”:
foundParen=True
打破

如果‘我认为你把问题严重地复杂化了

有多种方法可以使用
BeautifulSoup
中元素之间的直接父子关系。一种方法是

在这里,我们找到了
a
元素,这些元素位于
p
元素的正下方,带有
id=“mw content text”
——据我所知,这就是维基百科的主要文章所在的位置

如果需要单个元素,请使用
select\u one()
而不是
select()


另外,如果您想通过
find*()
,传递参数。

感谢您的回复!如果您不需要担心括号,那么这确实有效,但如果括号首先出现在段落中,则需要另一种逻辑。此外,有时链接会被包装成粗体标记。是否有一种获得此链接的通用方法?实际上,我认为如果您选择括号后的第一个链接不是斜体/粗体,则只会发生这种情况,因此此解决方案可能适用于我刚才提到的链接。
In [1]: import requests  

In [2]: from bs4 import BeautifulSoup   

In [3]: url = "https://en.wikipedia.org/wiki/Sierra_Leone"    

In [4]: response = requests.get(url)    

In [5]: soup = BeautifulSoup(response.content, "html.parser")

In [6]: [a.get_text() for a in soup.select("#mw-content-text > p > a")]
Out[6]: 
['West Africa',
 'Guinea',
 'Liberia',
 ...
 'Allen Iverson',
 'Magic Johnson',
 'Victor Oladipo',
 'Frances Tiafoe']