Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用BeautifulSoup,在使用搜索文本功能时是否可以移动到父标记?_Python_Beautifulsoup - Fatal编程技术网

Python 使用BeautifulSoup,在使用搜索文本功能时是否可以移动到父标记?

Python 使用BeautifulSoup,在使用搜索文本功能时是否可以移动到父标记?,python,beautifulsoup,Python,Beautifulsoup,当只有文本是公共标识符时,是否可以从DOM中的当前位置上下移动 <div>changing text</div> <div>fixed text</div> 您出现的错误是由于在ResultSet(一个结果列表)中调用了parent。如果需要获得多个结果,请尝试: x = soup.body.find_all(text=re.compile('fixed text')) for i in x: previous_div = i.p

当只有文本是公共标识符时,是否可以从DOM中的当前位置上下移动

<div>changing text</div>
    <div>fixed text</div>

您出现的错误是由于在ResultSet(一个结果列表)中调用了
parent
。如果需要获得多个结果,请尝试:

x = soup.body.find_all(text=re.compile('fixed text'))
for i in x:
    previous_div = i.previous_sibling
如果不想找到多个结果,只需将“全部查找”更改为“查找”:

x = soup.body.find(text=re.compile('fixed text')).previous_sibling

请注意,我将父项替换为上一个兄弟项,因为div处于同一级别

您遇到的错误是由于在结果集中调用父项(结果列表)。如果需要获得多个结果,请尝试:

x = soup.body.find_all(text=re.compile('fixed text'))
for i in x:
    previous_div = i.previous_sibling
如果不想找到多个结果,只需将“全部查找”更改为“查找”:

x = soup.body.find(text=re.compile('fixed text')).previous_sibling

请注意,我将父项替换为上一个兄弟项,因为div处于同一级别

此程序可能会执行您想要的操作:

from bs4 import BeautifulSoup
import re

html = '<body><div>changing text</div><div>fixed text</div><body>'

soup = BeautifulSoup(html)

x = soup.body.findAll(text=re.compile('fixed text'))[0].parent.previous_sibling

assert x.text == 'changing text'
从bs4导入美化组
进口稀土
html='更改文本固定文本'
soup=BeautifulSoup(html)
x=soup.body.findAll(text=re.compile('fixedtext'))[0].parent.previous\u同级
assert x.text==“更改文本”

此程序可能会执行您想要的操作:

from bs4 import BeautifulSoup
import re

html = '<body><div>changing text</div><div>fixed text</div><body>'

soup = BeautifulSoup(html)

x = soup.body.findAll(text=re.compile('fixed text'))[0].parent.previous_sibling

assert x.text == 'changing text'
从bs4导入美化组
进口稀土
html='更改文本固定文本'
soup=BeautifulSoup(html)
x=soup.body.findAll(text=re.compile('fixedtext'))[0].parent.previous\u同级
assert x.text==“更改文本”


您的尝试发生了什么?我得到一个错误:AttributeError:'ResultSet'对象没有属性'parent'…对不起,我将把它添加到问题
findAll
返回
ResultSet
-元素列表中。您想对结果集中的元素执行此操作。@逐位检查我编辑的答案@TalesPadua它不起作用,因为即使它们仍然只是兄弟,您仍然必须先移动到父级。我不知道为什么!您的尝试发生了什么?我得到一个错误:AttributeError:“ResultSet”对象没有属性“parent”……对不起,我将把它添加到问题
findAll
返回
ResultSet
-元素列表中。您想对结果集中的元素执行此操作。@逐位检查我编辑的答案@TalesPadua它不起作用,因为即使它们仍然只是兄弟,您仍然必须先移动到父级。我不知道为什么!我喜欢,但考虑到这是
find_all
,列表理解的顺序可能是
divs=[elem.previous_兄弟姐妹为elem-in-soup.body.findAll(text=re.compile('fixed text'))]
它可以工作,但我不太明白。正如传说中提到的,他们实际上是兄弟姐妹,那么我们为什么要让父母参与进来呢?@BitByBit-如果他们是兄弟姐妹,这就不应该起作用。但是我们没有足够的你的医生来解决这个问题。我贴了一个例子来制作一个div列表。。。这行吗?
.parent
是必需的,因为
findAll
返回字符串节点,而不是
节点。如果您希望
findAll
返回
节点,请尝试:
x=soup.body.findAll('div',text=re.compile('fixed text'))[0]。上一个兄弟姐妹
@tdelaney您很接近,Rob是对的
divs=[elem.parent.previous\u sibling for elem in soup.body.findAll(text=re.compile('fixed text'))]
我喜欢,但考虑到这是
find\u all
,一个列表理解可能需要顺序
divs=[elem.previous\u sibling for elem in soup.body.findAll(text=re.compile('fixed text'))]
它可以工作,但我不太明白。正如传说中提到的,他们实际上是兄弟姐妹,那么我们为什么要让父母参与进来呢?@BitByBit-如果他们是兄弟姐妹,这就不应该起作用。但是我们没有足够的你的医生来解决这个问题。我贴了一个例子来制作一个div列表。。。这行吗?
.parent
是必需的,因为
findAll
返回字符串节点,而不是
节点。如果您希望
findAll
返回
节点,请尝试:
x=soup.body.findAll('div',text=re.compile('fixed text'))[0]。上一个兄弟姐妹
@tdelaney您很接近,Rob是对的
divs=[elem.parent.previous\u soup.body.findAll(text=re.compile('fixed text'))中的elem的同级元素]
您将此更改为只查找单个元素。OP正在使用
findAll
,可能希望在多个节点上进行处理。是的,但OP出现的错误是由于在结果集中使用了父节点。我将对其进行编辑以澄清您将其更改为仅查找单个元素。OP正在使用
findAll
,可能希望在多个节点上进行处理。是的,但OP出现的错误是由于在结果集中使用了父节点。我将编辑以澄清