从下一个兄弟的文本中提取数字

时间:2017-08-26 21:19:00

标签: python python-2.7 parsing beautifulsoup nlp

我想将每个数字分配给python2.7中的合适标签。在下面的例子中,我有2个数字和2个标签。我不能迭代next_siblings的元素,因为NavigableString类型可能是这种情况。但是,如果我不能,我怎么能处理这个问题呢? 谢谢

编辑:我无法基于div标签进行搜索,因为名称和数字可能位于完全不同的html标签中。因此,我不想限制这一点。

from bs4 import BeautifulSoup
    tempHtml = """
    <html>
        <body>
            <div>
                <h1>tag1</h1>
                aaaa
                <div class="tel">here is 0111 111 1111 <span class="note">*</span></div>
                <h1>tag2</h1>
                <div class="tel mob">0111 222 2222 <span class="note">**</span></div>
            </div>
        </body>
    </html>
    """

soup = BeautifulSoup(tempHtml, 'html.parser')
extracted = soup.find_all(['h1'])
for i in range(len(extracted)):
    for sibling in extracted[i].next_siblings:
        tagname = extracted[i].text.strip()
        number_with_text = extracted[i].next_element
        number = re.findall('\d+', number_with_text)
        number = ''.join(number)
        print(str(number) + ' >> ' + str(tagname))

预期产出:

0111 111 1111 >> tag1
0111 222 2222 >> tag2

1 个答案:

答案 0 :(得分:0)

这是单向的。

找到h1 - div兄弟姐妹的列表。然后在每种情况下,从div的文本中删除电话号码,并获取text的上一个兄弟的div

>>> tempHtml = open('temp.htm').read()
>>> import bs4
>>> for div in soup.select('h1 ~ div'):
...     bs4.re.search(r'([0-9][0-9 ]{12})', div.text).groups(0)[0], '>>', div.findPreviousSibling().text
...     
... 
('0111 111 1111', '>>', 'tag1')
('0111 222 2222', '>>', 'tag2')