Python 类属性不包括在bs4对象中

Python 类属性不包括在bs4对象中,python,python-3.x,web-scraping,beautifulsoup,python-requests,Python,Python 3.x,Web Scraping,Beautifulsoup,Python Requests,我正在尝试刮取这个,我正在使用请求库和美化组。这里是交易,伙计们,我只需执行一个requests.get()并将其.content转换为bs4对象。(我的解析器是“html5lib”) 在此之前,正如您在图中所看到的,这个标签上有一个class属性。 你可以自己在网站上做一个inspect元素,看看我在说什么。您可以访问并右键单击已装箱的单词并检查元素 现在,当我获取它的.content并将其转换为bs4对象并打印出soup变量时,正如您所看到的标记不再具有类属性,它只是一个简单的。在这里查看

我正在尝试刮取这个,我正在使用
请求
库和
美化组
。这里是交易,伙计们,我只需执行一个
requests.get()
并将其
.content
转换为
bs4
对象。(我的解析器是
“html5lib”

在此之前,正如您在图中所看到的,这个标签上有一个
class
属性。 你可以自己在网站上做一个inspect元素,看看我在说什么。您可以访问并右键单击已装箱的单词并检查元素

现在,当我获取它的
.content
并将其转换为bs4对象并打印出
soup
变量时,正如您所看到的
标记不再具有
属性,它只是一个简单的
。在这里查看,我已经尝试在sublime文本中查找类值本身,但没有结果,因此这意味着
属性确实是未包含的

(我不能把汤的全部价值放在这里,因为汤太长了,我建议你也把它打印出来)

您可能想知道为什么我需要
class
属性?我需要它来收集基于该类的相关数据,我需要它专门基于该类,因为我不能只
.find()
a
p
标记,因为在很多情况下,可能会有其他
p
标记,但它们不是我试图获取的数据,所以我只是说得很精确

这是我编写的简单代码,请注意,我已经尝试在上面放置一个用户代理,因为我也搜索过,试图像浏览器一样伪装,但仍然没有运气:(有人能帮助我并告诉我为什么会发生这种情况吗?谢谢

import requests
from bs4 import BeautifulSoup

word = "opierać"

url = f"https://pl.wiktionary.org/wiki/{word}#{word}_(j%C4%99zyk_polski)"
headers = {"User-Agent": "Mozilla/5.0 (X11; CrOS x86_64 12871.102.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.141 Safari/537.36"}
r = requests.get(url,headers=headers)

print("Status code: ",r.status_code)
soup = BeautifulSoup(r.content,"html5lib")
print(soup)

正如@Gealber所提到的,我还建议您执行您的任务

示例

from selenium import webdriver
from bs4 import BeautifulSoup

word = "opierać"
url = f"https://pl.wiktionary.org/wiki/{word}#{word}_(j%C4%99zyk_polski)"

driver = webdriver.Chrome(executable_path=r'C:\Program Files\ChromeDriver\chromedriver.exe')
driver.get(url)
driver.implicitly_wait(3) 

soup = BeautifulSoup(driver.page_source,"html5lib")
p = soup.find('p', class_='lang-pl fldt-znaczenia')
print(p)
driver.close()
使用隐式等待网站()完全加载:

输出

<p class="lang-pl fldt-znaczenia"><i class="lang-pl fldt-znaczenia">czasownik przechodni niedokonany</i> (<link class="lang-pl fldt-znaczenia" href="mw-data:TemplateStyles:r6240524" rel="mw-deduplicated-inline-style"/><span class="short-container lang-pl fldt-znaczenia"><a class="mw-redirect lang-pl fldt-znaczenia" href="/wiki/Aneks:Skr%C3%B3ty_u%C5%BCywane_w_Wikis%C5%82owniku#D" title="Aneks:Skróty używane w Wikisłowniku"><span class="short-wrapper lang-pl fldt-znaczenia" data-expanded="aspekt dokonany" title="aspekt dokonany"><span class="short-content lang-pl fldt-znaczenia">dk.</span></span></a></span> <a class="lang-pl fldt-znaczenia" href="/wiki/opra%C4%87#pl" title="oprać">oprać</a>)
</p>

正如@Gealber所提到的,我还建议您执行您的任务

示例

from selenium import webdriver
from bs4 import BeautifulSoup

word = "opierać"
url = f"https://pl.wiktionary.org/wiki/{word}#{word}_(j%C4%99zyk_polski)"

driver = webdriver.Chrome(executable_path=r'C:\Program Files\ChromeDriver\chromedriver.exe')
driver.get(url)
driver.implicitly_wait(3) 

soup = BeautifulSoup(driver.page_source,"html5lib")
p = soup.find('p', class_='lang-pl fldt-znaczenia')
print(p)
driver.close()
使用隐式等待网站()完全加载:

输出

<p class="lang-pl fldt-znaczenia"><i class="lang-pl fldt-znaczenia">czasownik przechodni niedokonany</i> (<link class="lang-pl fldt-znaczenia" href="mw-data:TemplateStyles:r6240524" rel="mw-deduplicated-inline-style"/><span class="short-container lang-pl fldt-znaczenia"><a class="mw-redirect lang-pl fldt-znaczenia" href="/wiki/Aneks:Skr%C3%B3ty_u%C5%BCywane_w_Wikis%C5%82owniku#D" title="Aneks:Skróty używane w Wikisłowniku"><span class="short-wrapper lang-pl fldt-znaczenia" data-expanded="aspekt dokonany" title="aspekt dokonany"><span class="short-content lang-pl fldt-znaczenia">dk.</span></span></a></span> <a class="lang-pl fldt-znaczenia" href="/wiki/opra%C4%87#pl" title="oprać">oprać</a>)
</p>

您可以根据您想要的子
i
标记(需要bs4.7.1+)选择
p
标记,并且是第一个匹配此模式的标记

import requests
from bs4 import BeautifulSoup as bs

soup = bs(requests.get('https://pl.wiktionary.org/wiki/opiera%C4%87#opiera%C4%87(j%C4%99zyk_polski').content, 'lxml')
print(soup.select_one('p:has(i)').text)

您可以根据您想要的子
i
标记(需要bs4.7.1+)选择
p
标记,并且是第一个匹配此模式的标记

import requests
from bs4 import BeautifulSoup as bs

soup = bs(requests.get('https://pl.wiktionary.org/wiki/opiera%C4%87#opiera%C4%87(j%C4%99zyk_polski').content, 'lxml')
print(soup.select_one('p:has(i)').text)


这可能会有帮助:谢谢,但API似乎没有从我提供的特定页面收集数据的任务……我认为它似乎有所不同:(如果这是英文的话会有帮助。我不明白。你想要页面中没有类的
p
元素,但是你想要
class
?这个标签的类似乎是由JavaScript代码生成的,所以你不能使用漂亮的两个请求来获得它,相反,你可以使用Selenium。或者尝试在不依赖类的情况下获取这些信息。我们不需要使用英语,因为我也不知道如何说波兰语:是的,我想知道同样的事情。可能是因为javascript。有没有办法获得这些信息?正如您在图像上看到的,class属性在那里,但当我使用请求获取并解析它时。..class属性消失了。这可能会有帮助:谢谢,但API似乎没有从我提供的特定页面收集数据的任务…我认为它似乎有所不同:(如果这是英文的话会有帮助。我不明白。你想要页面中没有类的
p
元素,但是你想要
class
?这个标签的类似乎是由JavaScript代码生成的,所以你不能使用漂亮的两个请求来获得它,相反,你可以使用Selenium。或者尝试在不依赖类的情况下获取这些信息。我们不需要使用英语,因为我也不知道如何说波兰语:是的,我想知道同样的事情。可能是因为javascript。有没有办法获得这些信息?正如您在图像上看到的,class属性在那里,但当我使用请求获取并解析它时。…类属性消失了。谢谢!事实上,我最后一个选择是像您一样使用Selenium…但我仍然会做更多的研究和其他我能想到的方法…因为我尝试在没有任何其他第三方软件的情况下这样做。一旦我决定使用Selenium,我会检查这一点。我喜欢@QHarr的答案!但是对于问题关于我所指的,我认为最好的方法是在selenium上使用它。谢谢大家!谢谢!实际上我最后的选择是像你们一样使用selenium…但我仍然会做更多的研究和其他我可以想到的方法…因为我尝试在没有任何其他第三方软件的情况下使用它。一旦我决定使用se,我会检查这一点lenium.我喜欢@QHarr的答案!但是对于我所指的问题,我认为最好的方法是在selenium上使用它。.谢谢很多人!哇!谢谢!我不知道这是可能的!这也是一种使我的代码精确的好方法。…我可以问一下我能在
has
中放入任何我想说的东西吗?例如
我可以放置的标签
p:has(标签)谢谢?这个我认为是一个被选中的答案!但是只有一个答案……但是我认为这是一个代码<另一个<代码> >我的问题的另一个解决方案。谢谢!@ QHARR解决了没有任何代码> ID、名字或类< /代码>属性的伟大解决方案。我也仔细看一看。谢谢!我可以把任何我想要的标签放进去。那里?太好了!哇!谢谢!我不知道这是可能的!这也是一个让我的代码更精确的好方法…我可以问一下我能在里面放点什么吗