使用 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
我正在尝试使用 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