忽略 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 语句中,您将拥有有效文本。
我目前正在尝试在 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 语句中,您将拥有有效文本。