【问题标题】:Class attribute is not included in bs4 object类属性不包含在 bs4 对象中
【发布时间】:2020-11-30 03:23:48
【问题描述】:

我正在尝试抓取这个site,我正在使用requests 库和BeautifulSoup。所以这里的交易伙计们,我只是做一个requests.get() 并将其.content 转换为bs4 对象。 (我的解析器是"html5lib"

在此之前,正如您在此处的图片中看到的,此标签上有一个class 属性。 你可以自己在网站上做一个检查元素,看看我在说什么。您可以访问site 并右键单击框字并检查元素。

现在,当我得到 .content 并将其转换为 bs4 对象并打印出 soup 变量时,您可以看到我在箭头中指出的 <p> 标签 没有 不再是class 属性,它只是一个简单的<p>。在这里检查一下,我已经尝试在 sublime text 上查找类值本身但没有结果,所以这意味着class 属性确实是不包含

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

您可能想知道为什么我需要class 属性?我需要它来收集基于该类的相关数据,我需要它专门基于该类,因为我不能只是 .find() 一个 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)

【问题讨论】:

  • 这可能会有所帮助:stackoverflow.com/questions/3364279/…
  • 谢谢,但 API 似乎没有像我提供的那样从特定页面收集数据的任务......我认为它似乎不同:(
  • 如果是英文的话会有所帮助。我不明白。您想要页面中没有 classp 元素,但您想要 class?
  • 该标签 <p> 的类似乎是由 JavaScript 代码生成的,因此您将无法使用 BeautifouSouprequests来获取它>,而您可以使用 Selenium。或者尝试在不依赖课程的情况下获取该信息。
  • 我们不需要它是英文的,因为我也不知道如何说波兰语:D 是的,我想知道同样的事情.. 可能是因为 javascript.. 有吗有办法吗?正如您在图像上看到的那样,类属性在那里,但是当我使用请求获取它并解析它时......类属性消失了。

标签: python python-3.x web-scraping beautifulsoup python-requests


【解决方案1】:

正如@Gealber 所提到的,我还推荐Selenium 来执行您的任务。

示例

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()

使用隐式等待网站完全加载 (More about selenium waits):

driver.implicitly_wait(3) 

输出

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

您也可以使用特殊的class 找到所有p 标签并循环:

soup.find_all('p', class_='lang-pl fldt-znaczenia')

【讨论】:

  • 谢谢!实际上,我这样做的最后一个选择是像你所做的那样使用 Selenium ......但我仍然会做更多的研究和我能想到的其他方式......因为我试图在没有任何其他 3rd 方软件的情况下做到这一点.
  • 一旦我决定做 selenium,我会检查这个。
  • 我喜欢@QHarr 的回答!但对于我所指的问题,我认为最好的方法是将它放在硒上。非常感谢大家!
【解决方案2】:

你可以在p标签的基础上选择你想要的has一个子i标签(需要bs4.7.1+)并且是第一个匹配这个模式的。

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)

【讨论】:

  • 哇!谢谢!我不知道这是可能的!这也是使我的代码精确的好方法....请问我可以在has 中放入任何我想要的东西吗?例如 &lt;label&gt; 标签我可以放 p:has(label) 吗?谢谢
  • 这个我也认为是一个检查答案!
  • 但只能有一个答案......但我认为这是another解决我的问题的替代解决方案。谢谢!
  • @QHarr 没有任何 id, name or class 属性的出色解决方案 - 我也仔细看看。
  • 谢谢!所以我可以把我想要的任何可能的标签放在那里?太好了!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-13
相关资源
最近更新 更多