忽略 python 中的空 <p> 标签

Ignoring empty <p> tags in python

我目前正在尝试在 python 中编写一些 scraper 来构建一个 worlist,使用维基百科随机 url 来搜索最多的页面不同的词,我实际上有一个问题让它忽略空的 <p></p> 标签并使函数在它去后再次查询 url 抛出初始循环。

抱歉,代码很糟糕,但我对编程非常陌生,python而且我是自学成才的,所以很抱歉最终出现了面部表情。 :P

这是代码。

import requests
from bs4 import BeautifulSoup

def wiki_spider():
    value = 1
    wordlist = open("wordlist.txt","w")
    url = "https://en.wikipedia.org/wiki/Special:Random"
    while value == 1:
            sourcepage = requests.get(url)
            plaintext = sourcepage.text
            soup = BeautifulSoup(plaintext)
            for words in soup.findAll('p'):
                word = words.string
                ##if word == "\n":
                   ##wordlist.write("")
                ##wordlist.write(word)
                print(word)
    start()

def start():
    wiki_spider()

start()

感谢您的所有输入。

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

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

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> 标签,但也许你仍然可以通过不同的解决方案获得你想要的行为......如果内容是 [=45= 则只需写入文件]不是空的。

回答你关于循环的问题...

我不确定您是否希望让您的程序不断地一遍又一遍地查询该服务器,唯一的停止方法是键盘中断。但是如果你必须......你应该能够递归调用它:

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

您甚至在任何地方都不需要 start() 方法。您可以在其内部调用 wiki_spider()(这称为递归)。

不过就像我说的,这闻起来很有趣。请记住在您的计算机爆炸之前点击 ctrl + c 停止您的程序(夸张,但您明白了)。

忽略错误调用的递归和文件写入:

尝试:

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)

这将 "filter" 清空标签并打印 "NO WORD",您可以将其替换为 'pass'

在 else 语句中,您将拥有有效文本。