忽略python中的空<p>标记

时间:2015-08-09 05:56:50

标签: python python-2.7 beautifulsoup web-crawler

我目前正在尝试在python中编写一个小剪贴板来构建一个worlist,使用维基百科随机网址搜索大多数不同单词的页面,我实际上遇到了问题,使其忽略空{{1标签并使函数在抛出初始循环之后再次查询url。

对不起Crappy的代码,但我对编程和python非常非常新,我自学了很抱歉最终的facepalm时刻。 :P

这是代码。

<p></p>

感谢您输入的一切。

2 个答案:

答案 0 :(得分:0)

这是我的先发制人的答案,随着我获得更多信息,这可能会有所改变。

我的假设是,关于导致程序崩溃的空标签的问题源于这一行:

words = words.string

如果标记为空,string可能不会显示属性words

试试这个:

        for words in soup.findAll('p'):
            word = words.string
            if word != "\n":
              wordlist.write(word)
            print(word)

我不确定word可能等于什么(在标记为空的情况下是否实际为"\n",或者您是否要检查修剪后的字符串版本是否为""内容是<p>或者你有什么),但这个想法仍然存在:你只想写这个词是否存在。

您提出的问题是跳过start()代码,但也许您仍然可以通过不同的解决方案获得所需的行为...只需在内容为而不是空。

回答有关循环的问题......

我不确定您是否希望让您的程序不断地一遍又一遍地查询该服务器,只有这样才能阻止它成为键盘中断。但如果你必须......你应该能够递归地调用它:

def wiki_spider():   #所有代码,然后......   wiki_spider()

你甚至不需要wiki_spider()方法。您可以在其自身内调用ctrl + c(这称为递归)。

就像我说的那样,闻起来很有趣。只需记住在计算机爆炸之前点击<div class="parent"> <div class="child"> this is content ... </div> </div> 停止你的程序(夸大,但你明白了。)

答案 1 :(得分:0)

忽略严重调用的递归和文件写入:

尝试:

import requests
from bs4 import BeautifulSoup

url = "https://en.wikipedia.org/wiki/Special:Random"
while True:
    sourcepage = requests.get(url)
    plaintext = sourcepage.text
    soup = BeautifulSoup(plaintext)
    for words in soup.findAll('p'):
        word = words.string
        if word is None:
            print("NO WORD")
        else:
            print(word)

这将&#34;过滤&#34;空标签和打印&#34; NO WORD&#34;你可以用&#39;传递&#39;

代替 <\ n>在else语句中,您将拥有有效的文本。