Web scraping 如何刮除不';不属于类中的任何属性

Web scraping 如何刮除不';不属于类中的任何属性,web-scraping,beautifulsoup,Web Scraping,Beautifulsoup,这个问题发生在我昨天问的同一页上。网址是: 我正在努力拼凑比赛日期: 我想得到: 法兰克福瓦尔德体育场,2017年5月20日星期六-14:30 然后,摘录: 2017年5月20日 从inspect element视图来看,这恰好位于侧面: 我尝试在下面的代码中访问此div标记和teams类: import requests from bs4 import BeautifulSoup import csv import re url = "https://www.fourfourtwo.c

这个问题发生在我昨天问的同一页上。网址是:

我正在努力拼凑比赛日期: 我想得到:

法兰克福瓦尔德体育场,2017年5月20日星期六-14:30

然后,摘录:

2017年5月20日

从inspect element视图来看,这恰好位于侧面:

我尝试在下面的代码中访问此div标记和teams类:

import requests
from bs4 import BeautifulSoup
import csv
import re

url = "https://www.fourfourtwo.com/statszone/22-2016/matches/861695/team-stats/6339/0_SHOT_01#tabs-wrapper-anchor"
response = requests.get(url)
soup = BeautifulSoup(response.text, "lxml")
# Try find date
date = soup.select('div.teams')
date_raw = date[0].text
date_strip = date_raw.strip()
y = re.findall('(^[A-Z].+)\n', date_strip)
y1 = str(y).strip()
print(y1)
但这并不是很成功…结果仍然不知何故在一个列表中,有很多空间需要修剪。问题是这个类有很多子类,我只想访问class='teams'的text元素并提取日期

['Waldstadion Frankfurt, Saturday, May 20, 2017 - 14:30      ']

有没有更好的方法提取这个元素?非常感谢您的帮助和时间。

在解析之前,您可以使用纯JS

document.getElementById("match-head").
    children[0].
    innerText. 
    split(/[,-]/).
    splice(1,2).
    join("")

// produces " Saturday May 20"

前三条语句只是W3CDOM;最后3项是数组操作,提取以“-”或“,”字符分隔的第二项和第三项,并将它们重新连接在一起。

您可以在解析前使用纯JS进行操作

document.getElementById("match-head").
    children[0].
    innerText. 
    split(/[,-]/).
    splice(1,2).
    join("")

// produces " Saturday May 20"

前三条语句只是W3CDOM;最后3个是数组操作,用于提取由“-”或“,”字符分隔的第二个和第三个项目,并将它们重新连接在一起。

如您所见,所需的文本是
之后的第一个内容。您可以使用
.contents
属性在BeautifulSoup中访问它,该属性可以被索引(第一个内容为0):

印刷品:

Waldstadion Frankfurt, Saturday, May 20, 2017 - 14:30
编辑:

要解析位置、日期、时间的字符串,可以使用正则表达式:

from bs4 import BeautifulSoup
import requests
import re

r = requests.get('https://www.fourfourtwo.com/statszone/22-2016/matches/861695/team-stats/6339/0_SHOT_01#tabs-wrapper-anchor')
soup = BeautifulSoup(r.text, 'lxml')

data = soup.select_one('div.teams').contents[0].strip()

place, date, time = re.search(r'(.*?)(?:,.*?)((?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Dec)\s+\d+,\s+\d+).*?(\d+:\d+)', data).groups()
print(place)
print(date)
print(time)
这将打印:

Waldstadion Frankfurt
May 20, 2017
14:30

此正则表达式的解释如下。

如您所见,所需文本是
之后的第一个内容。您可以使用
.contents
属性在BeautifulSoup中访问它,该属性可以被索引(第一个内容为0):

印刷品:

Waldstadion Frankfurt, Saturday, May 20, 2017 - 14:30
编辑:

要解析位置、日期、时间的字符串,可以使用正则表达式:

from bs4 import BeautifulSoup
import requests
import re

r = requests.get('https://www.fourfourtwo.com/statszone/22-2016/matches/861695/team-stats/6339/0_SHOT_01#tabs-wrapper-anchor')
soup = BeautifulSoup(r.text, 'lxml')

data = soup.select_one('div.teams').contents[0].strip()

place, date, time = re.search(r'(.*?)(?:,.*?)((?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Dec)\s+\d+,\s+\d+).*?(\d+:\d+)', data).groups()
print(place)
print(date)
print(time)
这将打印:

Waldstadion Frankfurt
May 20, 2017
14:30

对这个正则表达式的解释是。

我的第一选择,
dateutil.parser
无法找到日期,所以我使用了一个简单的正则表达式来提取它。唯一需要注意的是,日期必须以完整的月份名称开始,以破折号或换行符结束

import re
import requests
from bs4 import BeautifulSoup

url = "https://www.fourfourtwo.com/statszone/22-2016/matches/861695/team-stats/6339/0_SHOT_01#tabs-wrapper-anchor"
soup = BeautifulSoup(requests.get(url).text, "lxml")

pattern = "(?:January|February|March|April|May|June|July|August|September|October|November|December)[^-\n.]+"
print(re.search(pattern, soup.select("div.teams")[0].text).group().strip())
输出:

2017年5月20日
就我个人而言,我相信该网站在日期格式方面会比逗号或空格更加一致,但这里有这样一个版本:

import re
import requests
from bs4 import BeautifulSoup

url = "https://www.fourfourtwo.com/statszone/22-2016/matches/861695/team-stats/6339/0_SHOT_01#tabs-wrapper-anchor"
soup = BeautifulSoup(requests.get(url).text, "lxml")

print(" ".join(re.split("\s+", soup.select("div.teams")[0].text)[4:7]))

我的第一个选择,
dateutil.parser
无法找到日期,所以我使用了一个简单的正则表达式来提取它。唯一需要注意的是,日期必须以完整的月份名称开始,以破折号或换行符结束

import re
import requests
from bs4 import BeautifulSoup

url = "https://www.fourfourtwo.com/statszone/22-2016/matches/861695/team-stats/6339/0_SHOT_01#tabs-wrapper-anchor"
soup = BeautifulSoup(requests.get(url).text, "lxml")

pattern = "(?:January|February|March|April|May|June|July|August|September|October|November|December)[^-\n.]+"
print(re.search(pattern, soup.select("div.teams")[0].text).group().strip())
输出:

2017年5月20日
就我个人而言,我相信该网站在日期格式方面会比逗号或空格更加一致,但这里有这样一个版本:

import re
import requests
from bs4 import BeautifulSoup

url = "https://www.fourfourtwo.com/statszone/22-2016/matches/861695/team-stats/6339/0_SHOT_01#tabs-wrapper-anchor"
soup = BeautifulSoup(requests.get(url).text, "lxml")

print(" ".join(re.split("\s+", soup.select("div.teams")[0].text)[4:7]))

因此,如果在其他情况下进一步使用/应用它,我必须学习JavaScript,对吗?我已经编辑了答案来解释它在做什么。在python中应该可以做到这一点,没有问题。BeautifulSoup库允许您将CSS选择器与
汤一起使用;有一百万个CSS教程网站。任何python教程都将介绍数组。您可以同时使用codecademy.com。非常感谢!真的很感激!当我在python spyder中运行它时,为什么在split()方法中会出现无效语法错误?因此,在其他情况下进一步使用/应用它,我必须正确地学习JavaScript?我已经编辑了答案来解释它的作用。在python中应该可以做到这一点,没有问题。BeautifulSoup库允许您将CSS选择器与
汤一起使用;有一百万个CSS教程网站。任何python教程都将介绍数组。您可以同时使用codecademy.com。非常感谢!真的很感激!当我在python spyder中运行它时,为什么在split()方法中会出现无效的语法错误?Andrej,你太棒了!顺便说一句,我研究了beautifulsoup,并以我自己的方式提取了x1、x2、y1、y2,尽管您的代码在理解结构的本质方面帮助了我很多@commentallez vous我更新了我的答案,看看如何解析字符串以获得所需的值(如地点、日期、时间)Andrej you rock!顺便说一句,我研究了beautifulsoup,并以我自己的方式提取了x1、x2、y1、y2,尽管您的代码在理解结构的本质方面帮助了我很多@commentallez-vous我更新了我的答案,看看如何解析字符串以获得所需的值(如地点、日期、时间)真是太棒了……现在我已经使用上面的方法结合正则表达式提取了日期,但这仍然是一个很好的方法。该站点与日期非常一致,因此,它可以使用您的解决方案在不同的页面上提取不同的日期。谢谢!太棒了…到现在为止,我已经使用上面的方法结合正则表达式提取了日期,但这仍然是一个很好的方法。该站点与日期非常一致,因此,它可以使用您的解决方案在不同的页面上提取不同的日期。谢谢!