正则表达式来清除web垃圾tex

2021-09-16 23:09:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试为wikipedia页面提取一些信息,我正在使用Beautiful soup将文本加载到Python中,但是我似乎很难使用正则表达式剥离所有不必要的标记。你知道吗

这是一个从靓汤输出的文本示例

[<td colspan="3">
</td>, <td valign="top" width="400">
<ul><li><a href="/wiki/Aach,_Baden-W%C3%BCrttemberg" title="Aach, Baden-Württemberg">Aach</a> (<a href="/wiki/Baden-W%C3%BCrttemberg" title="Baden-Württemberg">Baden-Württemberg</a>)</li>
<li><a href="/wiki/Aachen" title="Aachen">Aachen</a> (<a href="/wiki/North_Rhine-Westphalia" title="North Rhine-Westphalia">North Rhine-Westphalia</a>)</li>

理想情况下,我想有城市(这是指定的标题),和地区(这是刚刚结束前的行)。你知道吗

任何帮助都将不胜感激!你知道吗

rows = soup.find_all('td')
list_rows = []

#remove html tags
for row in rows:
    cells = row.find_all('li')
    str_cells = str(cells)
    clean = re.compile('<.*?>')
    clean2 = (re.sub(clean, '', str_cells))
    list_rows.append(clean2)
print(clean2)
2条回答
网友
1楼 ·

在这种情况下,可以使用.find_next_sibling()方法:

import re
import requests
from bs4 import BeautifulSoup

url='https://en.wikipedia.org/wiki/List_of_cities_and_towns_in_Germany'

soup = BeautifulSoup(requests.get(url).text, 'lxml')

for li in soup.select('td[width="400"] li'):
    city = li.select_one('a')
    if city.find_next_sibling('a'):
        region = city.find_next_sibling('a').text
    else:
        region = city.find_next_sibling(text=True).strip()
    print('{: <30}{}'.format(city.text, re.findall(r'[^()]+', region)[0]))

印刷品:

Aach                          Baden-Württemberg
Aachen                        North Rhine-Westphalia
Aalen                         Baden-Württemberg
Abenberg                      Bavaria
Abensberg                     Bavaria
Achern                        Baden-Württemberg
Achim                         Lower Saxony
Adelsheim                     Baden-Württemberg
Adenau                        Rhineland-Palatinate
Adorf                         Saxony
Ahaus                         North Rhine-Westphalia
Ahlen                         North Rhine-Westphalia
Ahrensburg                    Schleswig-Holstein
Aichach                       Bavaria
Aichtal                       Baden-Württemberg
Aken (Elbe)                   Saxony-Anhalt
Albstadt                      Baden-Württemberg
Alfeld                        Lower Saxony
Allendorf (Lumda)             Hesse
Allstedt                      Saxony-Anhalt

...and so on.
网友
2楼 ·

这里有两个正则表达式来执行您想要的操作:

这个正则表达式似乎可以获得所有城镇名称标题属性,不过如果城镇名称中有不同的特殊字符,则可能需要进行一些调整。这将捕获空格、破折号和逗号。 title=\"([\w ,-]+)\">[\w]+</a>[^\)]

你可以测试它here

这一个应该可以获得第一个捕获组中的区域名称,尽管关于特殊字符的警告同样适用: ([\w ,-]+)(</a>)?\)</li>

你可以测试它here

相关问题