簡體   English   中英

我如何循環re.search下一個數據

[英]how do i loop a re.search for the next data

我使用正則表達式從html表中抓取了2組數據

數據:

 <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>

正則表達式:

matchname = re.search('\<div class="name"><td>(.*?)</td>' , match3).group(1)
matchhp = re.search('\<div class="hp"><td>(.*?)</td>' , match3).group(1)
matchemail = re.search('\<div class="email"><td>(.*?)</td>' , match3).group(1)

所以使用正則表達式,我可以拿出來

random

123456

random@mail.com

所以在將這組數據保存到我的數據庫后,我想保存下一組如何獲得下一組數據? 我嘗試使用findall然后插入我的數據庫,但一切都在1行。 我需要將數據放在由set設置的數據庫中。

新的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。 (請不要使用此)

for thisMatch in re.findall(r"<td>(.+?)</td>.+?<td>(.+?)</td>.+?<td>(.+?)</td>", match3, re.DOTALL):
    print(thisMatch[0], thisMatch[1], thisMatch[2])

正如@Racialz指出的那樣,你應該考慮使用HTML解析器而不是正則表達式

讓我們看看BeautifulSoup和@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)

打印:

[{'email': 'random@mail.com', 'hp': '123456', 'name': 'random'},
 {'email': 'random123@mail.com', 'hp': '654321', 'name': 'random123'}]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM