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