使用 BeautifulSoup 隔离字符串

Isolating Strings Using BeautifulSoup

我正在尝试使用 BeautifulSoup 提取网页上列出的维度。目前,我的目标是将测量值附加到列表中。我之后的尺寸出现在如下所示的行上:

#Where the dimensions are `12.7x108mm` and `40x46 mm` respectively:

<td><a href="/12.7x108mm" title="12.7x108mm">12.7x108mm</a>

<td><a href="/40x46_mm" title="40x46 mm">40x46 mm</a>

但是,使用...

measurements_list = soup.find_all('td', href="", title="")

...returns 大约三分之一的页面,包括大部分不需要的数据。

我试图创建一个循环来排除其中包含 class 的任何行,因为我认为这将消除 90% 的无关 HTML 行:

dimensions_list = []
for data in soup.find_all('td', href="", title=""):
    if not data.find({'class': ''}):
        dimensions_list.append(data)

然而,这似乎对包含 class 的行没有任何影响。上次我处理类似的任务时,我放弃了,将 HTML 变成了一个字符串,然后将其分解成小块,直到得到我想要的。

提取这些维度或至少优化结果的合适方法是什么?


Link to my HTML soup on Pastebin.


这将复制我的汤和尝试的解决方案:

import requests
from bs4 import BeautifulSoup

url = "https://escapefromtarkov.gamepedia.com/Ammunition"
page = requests.get(url)
soup = BeautifulSoup(page.content, 'html.parser')

#First Attempt
dimensions_list = soup.find_all('td', href="", title="")

#Second Attempt
dimensions_list = []
for info in soup.find_all('td', href="", title=""):
    if not info.find('td', {'class': ''}):
        dimensions_list.append(info)

按元素和模式匹配怎么样?

试试这个:

import re

import requests
from bs4 import BeautifulSoup

page = requests.get("https://escapefromtarkov.gamepedia.com/Ammunition")
soup = BeautifulSoup(page.text, 'html.parser')

dimensions_list = soup.find_all(lambda t: t.name == "a" and re.search(r"\d\s?mm", t.text))

for anchor in dimensions_list:
    try:
        print(anchor["title"])
    except KeyError:
        continue

输出:

7.62x25mm Tokarev
9x18mm Makarov
9x19mm Parabellum
9x21mm Gyurza
4.6x30mm HK
5.7x28mm FN
5.45x39mm
5.56x45mm NATO
7.62x39mm
7.62x51mm NATO
7.62x54mmR
9x39mm
12.7x55mm STs-130
12.7x108mm
12x70mm
20x70mm
23x75mm
30x29mm
40x46 mm
7.62x25mm Tokarev
9x18mm Makarov
9x19mm Parabellum
9x21mm Gyurza
4.6x30mm HK
5.7x28mm FN
5.45x39mm
7.62x39mm
7.62x54mmR
9x39mm
12.7x55mm STs-130
12.7x108mm
5.56x45mm NATO
7.62x51mm NATO
12x70mm
12x70 7mm Buckshot
12/70 8.5 mm "Magnum" Buckshot
12x70 6.5 mm "Express" Buckshot
12/70 5.25mm Buckshot
20x70mm
20x70 7.5mm Buckshot
20/70 7.3mm Buckshot
20/70 6.2mm Buckshot
20/70 5.6mm Buckshot
23x75mm
30x29mm
40x46 mm