【问题标题】:Ignoring empty <p> tags in python忽略python中的空<p>标签
【发布时间】:2015-08-09 05:56:49
【问题描述】:

我目前正在尝试在 python 中编写一个小 scraper 来构建一个 worlist,使用 wikipedia 随机 url 搜索具有不同单词的大多数页面,我实际上遇到了一个问题,使其忽略空&lt;p&gt;&lt;/p&gt; 标记并让函数在抛出初始循环后再次查询 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()

感谢您的所有输入。

【问题讨论】:

  • 我看到了一个 while 循环,然后我看到 start 调用 wiki_spider,而后者又调用 start 进入遗忘状态。其背后的想法/意图是什么?
  • 我试图让函数 wiki_spider() 在它完成抛出页面时再次回调到 start()。但这种方法显然行不通。
  • 是的,我明白你在做什么,并且让方法在这样的无限循环中相互调用可能不是最好的主意,因为可能没有停止循环的好方法。这就是while/for(本机)循环方法的用途。
  • 所以为了确保我理解你的问题,看来这是你需要回答的两个问题:1)如何在循环中进行查询,2)如何忽略空的 &lt;p&gt;标签。是这样吗?
  • 好的,感谢您的意见。那么html

    标签呢,它们在终端上显示为 None ,因此无法添加到任何文件中,因为它只是崩溃了。我怎么能让它忽略空标签?

标签: python python-2.7 beautifulsoup web-crawler


【解决方案1】:

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

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

words = words.string

因为如果标记为空,words 上可能不存在属性 string

试试这个:

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

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

您提出的问题是跳过&lt;p&gt; 标记,但也许您仍然可以通过不同的解决方案获得您想要的行为......只需在内容为不是时写入文件空。

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

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

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

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

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

【讨论】:

  • 哈哈哈是的,我不会在无休止的时间内向维基百科发送垃圾邮件,我只是尝试将其作为思想的锻炼。我可能会让它查询 X 次而不是关机。但现在我只想让它运行。对于您提供的解决方案,该精确解决方案不起作用,它仍然返回相同的错误,但我确实理解您反过来说的意思,我会调查一下。非常感谢!
  • @Ronin825 是的,我认为精确的解决方案行不通,因为我不知道标签为空时words.string 会返回什么,但从概念上讲,所有解决方案都是选择 不写入文件...它不会尝试“跳过”任何空标签。
  • @Ronin825,不客气!希望这能让您更进一步。
  • 一旦处理完毕。以单字形式解析所有这些段落并进行程序检查以确保我没有两次。这将是多么令人头疼的时刻哈哈
【解决方案2】:

忽略调用不好的递归和文件写入:

尝试:

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)

这将“过滤”空标签并打印“NO WORD”,您可以将其替换为“pass”

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-07
    • 2017-03-11
    • 2017-07-25
    • 1970-01-01
    相关资源
    最近更新 更多