【问题标题】:Categorizing information from html tags对来自 html 标签的信息进行分类
【发布时间】:2017-10-29 19:46:55
【问题描述】:

我的问题可能有一个更好的标题,但它是: 我通过使用 BeautifulSoup 和 findall 将元素从 html 返回到列表,这是我得到的示例:

[<div class="tightLt col span-1-3">
    <div class="middle">
        <div class="cell"><i class="sqLed middle sm yellow margRtXs "></i></div>
        <div class="cell"><span class="middle">Neutral Outlook</span></div>
    </div>
</div>,
<div class="tightLt col span-1-3">
    <div class="middle">
        <div class="cell"><i class="sqLed middle sm yellow margRtXs "></i></div>
        <div class="cell"><span class="middle"><span class="showDesk">No opinion of</span> CEO</span>
        </div>
    </div>
</div>]
[<div class="tightLt col span-1-3">
    <div class="middle">
        <div class="cell"><i class="sqLed middle sm red margRtXs "></i></div>
        <div class="cell"><span class="middle">Doesn't Recommend</span></div>
    </div>
</div>,
<div class="tightLt col span-1-3">
    <div class="middle">
        <div class="cell"><i class="sqLed middle sm red margRtXs "></i></div>
        <div class="cell"><span class="middle">Negative Outlook</span></div>
    </div>
</div>,
<div class="tightLt col span-1-3">
    <div class="middle">
        <div class="cell"><i class="sqLed middle sm yellow margRtXs "></i></div>
        <div class="cell"><span class="middle"><span class="showDesk">No opinion of</span> CEO</span>
        </div>
    </div>
</div>]

问题在于,在第一个 html 中,CEO 批准(在这两种情况下,CEO 批准的对应值是“CEO 没有意见”,但也可能是“CEO 不批准”和“CEO 批准”)是"span" 标记内列表中的第二个元素,但它是第二个 html 中的第三个元素。所以我不能使用列表索引从列表中选择元素。我该如何解决我的问题?

这是返回上述列表的部分代码

from bs4 import BeautifulSoup
import requests
url = "https://www.glassdoor.com/Reviews/Walmart-Reviews-E715.htm"
html_content = response = requests.get(url)
soup = BS(html_content, "lxml")
        reviews = soup.find("div", id="EmployerReviews").find_all("li", class_="empReview")
        for review in reviews:
           x = soup.findAll("div", class_="cell reviewBodyCell") 
           for z in x:
               z.findAll("div", class_="tightLt col span-1-3")#returns the list that contains needed information

【问题讨论】:

  • 您指的是未出现在提供的 HTML 中的“CEO 批准”。我们是否应该假设您指的是第二列。如果您的问题准确地包含您想要表达的内容,那将会很有帮助。一些入门代码也会很有用。
  • 贴出你当前的代码,html标记不够
  • 抱歉,我的意思是“>没有 CEO 的意见”对应于第一和第二个 html 列表中 CEO 的批准
  • 好的,我会发布完整的代码,但您需要先登录才能获取数据
  • for x in soup.select("[class='showDesk']"):print(x.text) 应该会给你同样的结果。

标签: python html web-scraping beautifulsoup


【解决方案1】:

BeautifulSoup 的扩展和优化解决方案CSS selectors:

from bs4 import BeautifulSoup
import requests

url = "https://www.glassdoor.com/Reviews/Walmart-Reviews-E715.htm"
html_content = requests.get(url, headers={'user-agent': 'Mozilla/5.0'}).content
soup = BeautifulSoup(html_content, "lxml")

selector = "div#EmployerReviews li.empReview div.cell.reviewBodyCell span[class='showDesk']"
for x in soup.select(selector):
    print(x.parent.text)

输出:

No opinion of CEO
No opinion of CEO
No opinion of CEO
No opinion of CEO
Approves of CEO
No opinion of CEO
Approves of CEO
Approves of CEO
Approves of CEO

【讨论】:

  • 你是如何确定选择器的?
  • @edyvedy13,经验,我的朋友……经验)
  • 你能解释一下如何:) 吗?因为我必须在不同的时间点处理同样的事情
  • 因为当我只是右键单击并说复制选择器时,我没有得到相同的结果
  • @edyvedy13, div#EmployerReviews li.empReview div.cell.reviewBodyCell span[class='showDesk'] 是包含 CEO 标记的所需 span 元素的完整路径层次结构。就是这样
猜你喜欢
  • 2015-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-15
  • 2011-07-29
  • 1970-01-01
  • 2021-04-08
  • 2017-04-07
相关资源
最近更新 更多