Python 如何循环搜索下一个数据
我使用正则表达式从html表中抓取了两组数据 数据:Python 如何循环搜索下一个数据,python,html,regex,html-parsing,Python,Html,Regex,Html Parsing,我使用正则表达式从html表中抓取了两组数据 数据: <div class = "info"> <div class="name"><td>random</td></div> <div class="hp"><td>123456</td></div> <div class="email"><td>random@mail.com</td&g
<div class = "info">
<div class="name"><td>random</td></div>
<div class="hp"><td>123456</td></div>
<div class="email"><td>random@mail.com</td></div>
</div>
<div class = "info">
<div class="name"><td>random123</td></div>
<div class="hp"><td>654321</td></div>
<div class="email"><td>random123@mail.com</td></div>
</div>
所以,在将这组数据保存到我的数据库中之后,我想保存下一组数据,如何获取下一组数据?我尝试使用findall,然后将其插入数据库,但所有内容都在一行中。我需要的数据是在数据库中的一组一组
python新手请评论不清楚的部分将尝试编辑您不应该使用正则表达式解析HTML。只是一团糟,用BS4来做吧。以正确的方式进行:
soup = BeautifulSoup(match3, "html.parser")
names = []
allTds = soup.find_all("td")
for i,item in enumerate(allTds[::3]):
# firstname hp email
names.append((item.text, allTds[(i*3)+1].text, allTds[(i*3)+2].text))
为了回答这个问题,我想我会加入一个你永远都不应该使用的非常难看的正则表达式。特别是因为它是html,所以永远不要使用正则表达式来解析html。(请不要使用此选项)
对于re.findall(r“(.+?).+?(.+?).+?(.+?).+?(.+?)”、match3、re.DOTALL中的此匹配:
打印(此匹配[0]、此匹配[1]、此匹配[2])
正如@Racialz所指出的那样,你应该调查一下
让我们像@Racialz一样,构建一个更健壮的解决方案。查找所有info
元素,并找到输出中生成字典列表的所有字段:
from pprint import pprint
from bs4 import BeautifulSoup
data = """
<div>
<div class = "info">
<div class="name"><td>random</td></div>
<div class="hp"><td>123456</td></div>
<div class="email"><td>random@mail.com</td></div>
</div>
<div class = "info">
<div class="name"><td>random123</td></div>
<div class="hp"><td>654321</td></div>
<div class="email"><td>random123@mail.com</td></div>
</div>
</div>
"""
soup = BeautifulSoup(data, "html.parser")
fields = ["name", "hp", "email"]
result = [
{field: info.find(class_=field).get_text() for field in fields}
for info in soup.find_all(class_="info")
]
pprint(result)
你不应该用正则表达式解析html。你可以发布你所展示的html块的父标记,或者发布你所得到的完整html输入吗?谢谢。@ Alcxe在父母标签中加了一句:我使用的正则表达式是第二个边界,前1个是使用父母标记,如果你有一个后续问题,请考虑创建一个单独的问题。谢谢。我看到人们尖叫着不要使用正则表达式来解析HTML,但是Beauty Soup或lxml在内部解析HTML使用了什么呢?还有,为什么使用正则表达式解析HTML不好?@Smac89,因为如果网站更新,td更改为
或其他任何内容,整个过程都会中断。美丽集团知道如何处理这些事情。这个正则表达式只能捕获介于
和
之间的内容,而BS4无论如何都能工作。@Racialz因为这是我创建的一个演示网站,所以我不会更新网站,而且有人要求我不要使用任何解析器,因为正则表达式已经足够了,谢谢你回答任何一种方式,这肯定更好,当我写我的答案时,op没有包含info div,所以我的bs4代码很奇怪。如果你在我写我的答案时检查ops编辑历史记录,它只是6“
soup = BeautifulSoup(match3, "html.parser")
names = []
allTds = soup.find_all("td")
for i,item in enumerate(allTds[::3]):
# firstname hp email
names.append((item.text, allTds[(i*3)+1].text, allTds[(i*3)+2].text))
for thisMatch in re.findall(r"<td>(.+?)</td>.+?<td>(.+?)</td>.+?<td>(.+?)</td>", match3, re.DOTALL):
print(thisMatch[0], thisMatch[1], thisMatch[2])
from pprint import pprint
from bs4 import BeautifulSoup
data = """
<div>
<div class = "info">
<div class="name"><td>random</td></div>
<div class="hp"><td>123456</td></div>
<div class="email"><td>random@mail.com</td></div>
</div>
<div class = "info">
<div class="name"><td>random123</td></div>
<div class="hp"><td>654321</td></div>
<div class="email"><td>random123@mail.com</td></div>
</div>
</div>
"""
soup = BeautifulSoup(data, "html.parser")
fields = ["name", "hp", "email"]
result = [
{field: info.find(class_=field).get_text() for field in fields}
for info in soup.find_all(class_="info")
]
pprint(result)
[{'email': 'random@mail.com', 'hp': '123456', 'name': 'random'},
{'email': 'random123@mail.com', 'hp': '654321', 'name': 'random123'}]