我正在解析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
我在这里做错了什么?
答案 0 :(得分:1)
你应该使用这样的东西:
for p in soupArticle.findAll("article", {"itemprop":"articleBody"}):
textList = p.find_all("p")
print(len(textList))
这可能会有所帮助。
答案 1 :(得分:1)
您在浏览器中看到的HTML与使用urllib
,requests
或其他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