Python正则表达式:从具有类似结构的html元素获取文本

时间:2018-10-02 14:51:50

标签: python regex

由于某些原因,我需要使用正则表达式从网站中提取一些数据。数据具有类似的HTML结构,仅文本有所不同。 为简单起见,我以这种方式显示它:

p = '<div class="col-xs-6"><p>Gender:</p></div><div class="col-xs-6"><a href="/skor/herr">Herr</a>, <a href="/skor/dam">Dam</a></div>'
t = '<div class="col-xs-6"><p>Kategori:</p></div><div class="col-xs-6"><a href="/skor/kangor-boots">Boots</a></div>'
s = p + t

我只对“性别”感兴趣,这意味着我只想提取“ Herr”和“ Dam”。

到目前为止,我想出了两个选择-都不起作用:

m = re.findall("Gender.+?<div.+?>([\w ]+)<\/.+?<\/div>", s, re.DOTALL)

给予:

['Herr']

我猜是因为它不是贪婪的

但是,如果我让它变得贪婪:

re.findall("Gender.+?<div.+>([\w ]+)<\/.+?<\/div>", s, re.DOTALL)

它返回:

['Boots']

所以我在努力弄清楚如何同时获得“ Herr”和“ Dam”,仅此而已?

1 个答案:

答案 0 :(得分:1)

您可以通过这种方式使用BeautifulSoup

from bs4 import BeautifulSoup
a='<div class="col-xs-6"><p>Gender:</p></div><div class="col-xs-6"><a href="/skor/herr">Herr</a>, <a href="/skor/dam">Dam</a></div>'
soup = BeautifulSoup(a,"html.parser")
if 'Gender' in (str(soup.findAll('div'))):
    for ana in soup.findAll('div'):
        for i in ana.findAll('a'):
            print(i.next_element) 

输出:

Herr
Dam

我建议将div属性添加到div中,以便更轻松地确定正确的标签

p = '<div name="Gender" class="col-xs-6"><p>Gender:</p></div><div name="Gender" class="col-xs-6"><a href="/skor/herr">Herr</a>, <a href="/skor/dam">Dam</a></div>'
t = '<div class="col-xs-6"><p>Kategori:</p></div><div class="col-xs-6"><a href="/skor/kangor-boots">Boots</a></div>'
a = p + t

soup = BeautifulSoup(a,"html.parser")
for ana in soup.findAll('div',{"name":"Gender"}):
    for i in ana.findAll('a'):
        print(i.next_element) 

输出:

 Herr
 Dam