无法摆脱不需要的输出[重复]
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。 这是我第一次尝试使用任何模式来解析标题。但是,你能告诉我为什么它失败了(使用消极的后视和积极的前瞻)'(?<!hyperlink">)How.+(?=</a>)'
?
@asmitu (?<!hyperlink">)
匹配一个没有紧跟在 hyperlink">
前面的位置。您想使用积极的后视(?<=hyperlink">)
。但是您不需要,因为很容易捕获字符串的一部分并通过.group(n)
获取其值。
非常感谢@Wiktor Stribiżew。您刚刚通过提供该答案使我免于创建另一个帖子。以上是关于无法摆脱不需要的输出[重复]的主要内容,如果未能解决你的问题,请参考以下文章
为啥 windeployqt 输出不需要的文件,我该如何摆脱它们?