无法摆脱不必要的输出

时间:2018-07-08 09:21:33

标签: python regex python-3.x web-scraping

我已经用python与re模块组合编写了一个脚本,以从网页中获取不同问题的标题。我的目的不是使用BeautifulSoup,而是仍然能够解析标题。我使用模式的方式可以做到。但是,输出看起来不太好。我怎样才能只获得问题标题而不是其他。

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

import requests
import re

link = "https://stackoverflow.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?

我是正则表达式的新手。因此,如果我的问题不适合作为问题,我会提前道歉。

1 个答案:

答案 0 :(得分:2)

您只需要使用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并不是一个很好的例子),但是如果您试图完成实际工作,则可以最好使用解析器。