This question already has answers here:
RegEx match open tags except XHTML self-contained tags
                                
                                    (34个答案)
                                
                        
                                2年前关闭。
            
                    
由于某些原因,我需要使用正则表达式从网站中提取一些数据。数据具有类似的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)


它返回:

['靴子']

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

最佳答案

您可以通过这种方式使用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添加name属性,以便更容易确定正确的标签

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

关于python - Python正则表达式:从具有相似结构的html元素获取文本,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52610930/

10-12 01:56