无法摆脱不需要的输出[重复]

Posted

技术标签:

【中文标题】无法摆脱不需要的输出[重复]【英文标题】:Can't get rid of unwanted output [duplicate] 【发布时间】:2018-12-16 06:03:23 【问题描述】:

我在 python 中结合re 模块编写了一个脚本,以从网页中获取不同问题的标题。我的意图是不使用BeautifulSoup 并且仍然能够解析标题。我使用模式的方式可以做到这一点。但是,输出看起来并不那么好。我怎样才能只得到问题标题而没有其他任何东西。

这是我的尝试(使用re.search()):

import requests
import re

link = "https://***.com/questions/tagged/web-scraping"

res = requests.get(link).text
for item in res.splitlines():
    matchitem = re.search(r'hyperlink">(How.+)</a>',item)
    if matchitem:
        print(matchitem.group())

我得到的输出(从几个中):

hyperlink">How to use Selenium check the checkbox lists?</a>

我希望得到的是这样的:

How to use Selenium check the checkbox lists?

我对正则表达式很陌生。所以,如果我的问题不适合成为问题,我会提前道歉。

【问题讨论】:

使用正则表达式解析 html 代码最初是个坏主意。为什么你不想使用 BeautifulSoup?您也可以检查恕我直言更好的选择 - lxml.html 【参考方案1】:

您只需要使用group(1),它会获取第一个捕获的子组,而不是group(),它会获取整个匹配项。

来自the docs

返回匹配的一个或多个子组。如果只有一个参数,则结果为单个字符串;如果有多个参数,则结果是一个元组,每个参数一个项目。如果没有参数,group1 默认为零(返回整个匹配项)。

所以:

>>> item = 'blah blah hyperlink">How to use Selenium check the checkbox lists?</a> stuff'
>>> matchitem = re.search(r'hyperlink">(How.+)</a>',item)
>>> matchitem
<_sre.SRE_Match object; span=(10, 70), match='hyperlink">How to use Selenium check the checkbox>
>>> matchitem.group()
'hyperlink">How to use Selenium check the checkbox lists?</a>'
>>> matchitem.group(1)
'How to use Selenium check the checkbox lists?'

附注:

我的意图是不使用 BeautifulSoup 并且仍然能够解析标题。我使用模式的方式可以做到这一点。

真的吗?我可以很容易地构建你的正则表达式会做错事的例子。即使没有半病态的数据,如果他们在周二推送一个新的网站小版本,甚至没有触及这部分代码,鉴于属性是任意排序的,a 的属性可能会出现在不同的顺序,突然你的搜索失败了,而一个简单的 BeautifulSoup 搜索仍然有效。

如果您这样做是为了学习正则表达式,那可能没问题(尽管实际上,HTML 并不是一个很好的例子),但是如果您想完成实际工作,您'最好使用解析器。

【讨论】:

我要等 7 分钟才能接受你的回答@abarnert。 这是我第一次尝试使用任何模式来解析标题。但是,你能告诉我为什么它失败了(使用消极的后视和积极的前瞻)'(?&lt;!hyperlink"&gt;)How.+(?=&lt;/a&gt;)' @asmitu (?&lt;!hyperlink"&gt;) 匹配一个没有紧跟在 hyperlink"&gt; 前面的位置。您想使用积极的后视(?&lt;=hyperlink"&gt;)。但是您不需要,因为很容易捕获字符串的一部分并通过.group(n) 获取其值。 非常感谢@Wiktor Stribiżew。您刚刚通过提供该答案使我免于创建另一个帖子。

以上是关于无法摆脱不需要的输出[重复]的主要内容,如果未能解决你的问题,请参考以下文章

为啥 windeployqt 输出不需要的文件,我该如何摆脱它们?

摆脱python中的零[重复]

我需要帮助弄清楚如何将 getline 放入 presentStringPrompt 以摆脱重复代码

R randomForest子集无法摆脱因子水平[重复]

无法摆脱表单输入的绿色背景[重复]

铁路围栏密码摆脱循环重复[关闭]