【问题标题】:Using BeautifulSoup and lxml to extract nested divs in HTML code使用 BeautifulSoup 和 lxml 提取 HTML 代码中的嵌套 div
【发布时间】:2017-08-10 11:47:28
【问题描述】:

我有这个 HTML 代码:http://imgur.com/a/dPNYI
我正在尝试提取并打印图像中突出显示的行 ("some text").
"some text" 是第一个 div 的文本,class=chat-message 嵌套在 id=chat-messages 的 div 中(换句话说,我试图提取第一个子 div 的文本div id=chat-messages,而他所有的孩子在结构上都相似)。

我尝试过的:

import requests
from bs4 import BeautifulSoup

url = "the url this is used for"
r = requests.get(url)

soup = BeautifulSoup(r.content, 'lxml')
g_data = soup.find('div',{'class':'chat-message-content selectable'})
print(g_data.text)

这给了我错误:

AttributeError: 'NoneType' object has no attribute 'text'

好像g_dataNULL
我做错了什么?谢谢!


HTML 代码:

<html>
<head>
    <title>
    </title>
</head>

<body>
    <div id="main">
        <div data-reactroot="" id="app">
            <div class="top-bar-authenticated" id="top-bar">
            </div>


            <div class="closed" id="navigation-bar">
            </div>


            <div id="right-sidebar">
                <div id="chat">
                    <div id="chat-head">
                    </div>


                    <div id="chat-title">
                    </div>


                    <div id="chat-messages">
                        <div class="chat-message">
                            <div class="chat-message-avatar" style="background-image: url(&quot;https://steamcdn-a.akamaihd.net/steamcommunity/public/images/avatars/65/657dcec97cc00bc378629930ecae1776c0d981e0.jpg&quot;);">
                            </div>
                            <a class="chat-message-username clickable">
                            <div class="iron-color">
                                aloe
                            </div></a>

                            <div class="chat-message-content selectable">
                                <!-- react-text: 2532 -->some text<!-- /react-text -->
                            </div>
                        </div>


                        <div class="chat-message">
                            <div class="chat-message-avatar" style="background-image: url(&quot;https://steamcdn-a.akamaihd.net/steamcommunity/public/images/avatars/65/657dcec97cc00bc378629930ecae1776c0d981e0.jpg&quot;);">
                            </div>
                            <a class="chat-message-username clickable">
                            <div class="iron-color">
                                aloe
                            </div></a>

                            <div class="chat-message-content selectable">
                                <!-- react-text: 2533 -->some other text<!-- /react-text -->
                            </div>
                        </div>


                        <div class="chat-message">
                        </div>


                        <div class="chat-message">
                        </div>


                        <div class="chat-message">
                        </div>


                        <div class="chat-message">
                        </div>

【问题讨论】:

  • @akashkarothiya 那么我该如何提取“一些文本”呢?
  • 刚刚尝试过这个网址:timsiteweb.free.fr/lxml.html,它成功了!也许问题发生在您提出请求之前?如果打印 r.content 会发生什么?
  • 你是对的,这很奇怪..它打印(部分):
    而不是“主要”分区。知道为什么吗?
  • 不知道,我看到一个假设:您的 HTML 似乎未完成(缺少许多 &lt;/div&gt;&lt;/body&gt;&lt;/html&gt;)。也许尝试完成它?

标签: python beautifulsoup lxml


【解决方案1】:

阅读您的 cmets 关于我看到您正在尝试解析使用 JavaScript 加载内容的网站的问题,这就是 requests 不适合您的原因。您应该将selenium 与网络驱动程序一起使用(例如,ChromedriverPhantomJS)。类似于下面的代码:

from bs4 import BeautifulSoup
from selenium import webdriver

driver = webdriver.Chrome()
driver.get("https://www.csgoarena.com/home")

soup = BeautifulSoup(driver.page_source, 'lxml')
g_data = soup.findAll('div',{'class':'chat-message-content selectable'})
print(g_data)

由于您想要所有选定元素的.text

>>> for match in g_data:
    print(match.text)


not everytime :D
I understand :)
 NuuZy csgoarena.com but he won GA's only when it were long 
Yea I always saw him
Everyday
caught
(...)

【讨论】:

  • 你帮了大忙。感谢您的宝贵时间!
【解决方案2】:

如果你想搜索匹配两个或多个 CSS 类的标签,你应该使用 CSS 选择器:

g_data = soup.select('div.chat-message-content.selectable')

【讨论】:

  • 尽管这适用于给定的 html 示例,lxml 解析器支持多个类,所以这不是这里的问题。
猜你喜欢
  • 2021-10-11
  • 2019-04-10
  • 2016-05-11
  • 2018-06-06
  • 2011-02-07
  • 2013-12-18
  • 2022-11-14
  • 1970-01-01
  • 2012-11-21
相关资源
最近更新 更多