findAll不起作用,嵌套标签

时间:2016-08-18 11:38:05

标签: python web-scraping beautifulsoup

我正在解析this页面。我需要获取文本内容 - 它位于p标记中。页面的一般结构如下:

<html>
    <body>
        <article itemprop="articleBody">
            <div...>
               <div...>
                  <figure>
                  <span..></span>
                  <p>THE TEXT</p>
                  </figure>
              </div>
           </div>
        </article>
    </body>
</html>

因此p不是article的直接子项,但它仍在内部,findAll应该能够找到它。但事实并非如此。

articleBody=soupArticle.find("article", {"itemprop":"articleBody"})
textList=articleBody.findAll("p")
print(len(textList)) #gives 0

我在这里做错了什么?

4 个答案:

答案 0 :(得分:1)

你应该使用这样的东西:

for p in soupArticle.findAll("article", {"itemprop":"articleBody"}):
    textList = p.find_all("p")
    print(len(textList))

这可能会有所帮助。

答案 1 :(得分:1)

您在浏览器中看到的HTML与使用urllibrequests或其他HTTP客户端检索HTML时所获得的HTML不同 - 假设这样做你如何获得HTML。

那是因为你所使用的内容是用Javascript动态插入到文档中的。您可能需要使用类似Selenium webdriver的内容来以编程方式控制浏览器,以便通过Javascript呈现内容。

articleBody

之后查看find()的值
import urllib2
from bs4 import BeautifulSoup

url = 'https://www.wired.com/2016/08/live-debate-whats-right-kind-intersection'
html = urllib2.urlopen(url).read()
soup = BeautifulSoup(html)

>>> print soup.article
<article class="content link-underline relative body-copy" data-js="content" itemprop="articleBody">
<a class="visually-hidden skip-to-text-link focusable bg-white" href="#start-of-content">Go Back to Top. Skip To: Start of Article.</a>
</article>

这表明内容不是您认为的内容,它嵌入在<script>标记中,并在加载页面时由Javascript动态插入。

答案 2 :(得分:0)

这应该让你开始:

from bs4 import BeautifulSoup
import mechanize

url = "https://www.wired.com/2016/08/live-debate-whats-right-kind-intersection"
br = mechanize.Browser()
response = br.open(url)
soup = BeautifulSoup(response, 'html.parser')


media = []
 for x in soup.findAll("script",{"type":"text/javascript"}):
media.append(x.get_text().split("*/"))

med = media[4][1].split("<p>")
strin=[]
for i, element in enumerate(med):
    strin.append("")
    for char in element:
        strin[i]+=char
        if char=="<":
            break

for text in strin:
   print text

如果需要,您可以使用'utf-8'对文本进行编码。

答案 3 :(得分:-2)

检查文档,你确定它是findAll吗? https://www.crummy.com/software/BeautifulSoup/bs4/doc/#find-all