gpt4 book ai didi

python - 查找元素的直接子元素

转载 作者:行者123 更新时间:2023-11-28 00:58:53 25 4
gpt4 key购买 nike

我正在编写一个解决方案来测试 this Python 中的现象。我已经完成了大部分逻辑,但是在访问维基百科文章中的链接时会出现许多边缘情况。

我遇到的问题出现在像 this 这样的页面上第一个<p>在哪里有多个级别的子元素,第一个 <a>需要提取第一组括号后的标记。在这种情况下,(要提取 this link ),您必须跳过括号,然后转到下一个 anchor 标记/href。在大多数文章中,我的算法可以跳过括号,但是通过查找括号前面的链接(或者如果它们不存在)的方式,它会在错误的位置找到 anchor 标记。具体来说,这里:<span style="font-size: small;"><span id="coordinates"><a href="/wiki/Geographic_coordinate_system" title="Geographic coordinate system">Coordinates</a>

该算法的工作原理是遍历第一段标记(在文章的主体中)中的元素,迭代地对每个元素进行字符串化,然后首先检查它是否包含“(”或“

是否有任何直接的方法来避免嵌入 anchor 标记并且只采用第一个链接的直接子链接 <p> ?

下面是带有这段代码的函数供引用:

**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**

最佳答案

我认为你把问题严重地复杂化了。

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

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']

在这里我们找到了 a 元素,它们直接位于 p 元素的正下方 id="mw-content-text" - 据我所知,这是维基百科主要文章所在的位置。

如果您需要单个元素,请使用 select_one() 而不是 select()

另外,如果你想通过find*()解决它,传递recursive=False争论。

关于python - 查找元素的直接子元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43150869/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com