Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何循环搜索下一个数据_Python_Html_Regex_Html Parsing - Fatal编程技术网

Python 如何循环搜索下一个数据

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

我使用正则表达式从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></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'}]