【问题标题】:Python - How to split a text taken from a html sitePython - 如何拆分取自 html 站点的文本
【发布时间】:2019-02-05 15:49:42
【问题描述】:

所以我正在制作一个小脚本,基本上每次我的 UPS 跟踪有更新时我都会打印出来。

现在我已经完成了一个看起来像这样的脚本:

 tracking_full_site = 'https://wwwapps.ups.com/WebTracking/track?track=yes&trackNums=' + url #URL is the last tracking numbers that I can't provide due to incase someone changes anything with my tracking.

    headers = {
        'User-Agent': ('Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36'
                       ' (KHTML, like Gecko) Chrome/68.0.3440.75 Safari/537.36')
    }
    resp = s.get(tracking_full_site, headers=headers, timeout=12)
    resp.raise_for_status()

    bs4 = soup(resp.text, 'lxml')
    old_list = []

    for item in bs4.findAll('tr', {'valign': 'top'}):
        where_is_it = " ".join(item.text.split())
        old_list.append(where_is_it)

    print(old_list)

    sys.exit()

但是我得到的输出是:

United States 28.08.2018 6:16 Package departed international carrier facility
Edgewood, NY, United States 27.08.2018 20:00 Package transferred to post office
United States 27.08.2018 18:42 Package processed by international carrier
EDGEWOOD, NY, United States 24.08.2018 15:51 Package processed by UPS Mail Innovations origin facility
24.08.2018 12:55 Package received for processing by UPS Mail Innovations
United States 22.08.2018 8:19 Shipment information received by UPS Mail Innovations

" ".join(item.text.split())这个函数看起来很不错

我的问题是,我怎样才能拆分它以便等我可以打印出国家等或日期、时间或描述?

编辑:

这是任何人都想看到的完整 HTML:

<table summary="" border="0" cellpadding="0" cellspacing="0" class="dataTable">
   <tbody>
      <tr>
         <th scope="col">Location</th>
         <th scope="col">Date</th>
         <th scope="col">Local Time</th>
         <th scope="col" class="full">Activity&nbsp;(<a class="btnlnkR helpIconR" href="javascript:helpModLvl('https://www.ups.com/content/se/en/tracking/tracking/description.html')">What's this?</a>)</th>
      </tr>
      <tr valign="top">
         <td class="nowrap">
            United States
         </td>
         <td class="nowrap">
            28.08.2018
         </td>
         <td class="nowrap">
            6:16
         </td>
         <td>Package departed international carrier facility</td>
      </tr>
      <tr valign="top" class="odd">
         <td class="nowrap">
            Edgewood,&nbsp;
            NY,&nbsp;
            United States
         </td>
         <td class="nowrap">
            27.08.2018
         </td>
         <td class="nowrap">
            20:00
         </td>
         <td>Package transferred to post office</td>
      </tr>
      <tr valign="top">
         <td class="nowrap">
            United States
         </td>
         <td class="nowrap">
            27.08.2018
         </td>
         <td class="nowrap">
            18:42
         </td>
         <td>Package processed by international carrier</td>
      </tr>
      <tr valign="top" class="odd">
         <td class="nowrap">
            EDGEWOOD,&nbsp;
            NY,&nbsp;
            United States
         </td>
         <td class="nowrap">
            24.08.2018
         </td>
         <td class="nowrap">
            15:51
         </td>
         <td>Package processed by UPS Mail Innovations origin facility</td>
      </tr>
      <tr valign="top">
         <td class="nowrap">
         </td>
         <td class="nowrap">
            24.08.2018
         </td>
         <td class="nowrap">
            12:55
         </td>
         <td>Package received for processing by UPS Mail Innovations</td>
      </tr>
      <tr valign="top" class="odd">
         <td class="nowrap">
            United States
         </td>
         <td class="nowrap">
            22.08.2018
         </td>
         <td class="nowrap">
            8:19
         </td>
         <td>Shipment information received by UPS Mail Innovations</td>
      </tr>
   </tbody>
</table>

我的输出愿望是等:

Country: United State
Date: 28.08.2018
Time: 6:16
Description: Package departed international carrier facility

正如您在印刷品中看到的那样,并非所有东西都有各自的国家。请注意这一点!

致答案编辑之一:

['Sweden', '29.08.2018', '11:08', 'Package arrived at international carrier']
['United States', '28.08.2018', '6:16', 'Package departed international carrier facility']
['Edgewood,\t\t\t\t\t\t\t\n\n\t\t\t\t            \n\t\t\t\t            \t\n\t\t\t\t            \tNY,\t\t\t\t            \n\n\t\t\t\t            \n\t\t\t\t            \t\n\t\t\t\t            \tUnited States', '27.08.2018', '20:00', 'Package transferred to post office']
['United States', '27.08.2018', '18:42', 'Package processed by international carrier']
['EDGEWOOD,\t\t\t\t\t\t\t\n\n\t\t\t\t            \n\t\t\t\t            \t\n\t\t\t\t            \tNY,\t\t\t\t            \n\n\t\t\t\t            \n\t\t\t\t            \t\n\t\t\t\t            \tUnited States', '24.08.2018', '15:51', 'Package processed by UPS Mail Innovations origin facility']
['', '24.08.2018', '12:55', 'Package received for processing by UPS Mail Innovations']
['United States', '22.08.2018', '8:19', 'Shipment information received by UPS Mail Innovations']

【问题讨论】:

  • 你能详细说明你需要什么样的输出吗?
  • @sauravverma 最后编辑!

标签: python beautifulsoup


【解决方案1】:
array = []
for item in soup.findAll('tr', {'valign': 'top'}):
     array.append([f.text.strip().replace("\xa0\n\t", "") for f in item.findAll("td")])
output = []
for e in array:
   output.append({"Country": e[0].replace("   ", ""), "Date": e[1], "Time": e[2], "Description": e[3]})

 if you want to print only the country, just do this
 for element in output:
    print (element["Country"])

【讨论】:

  • 部分国家有\t\t\t\t\t\t\t\n\n\t\t\t\t \n\t\t\t\t \t\n\t\t\t\t \tNY,\t\t\t\t \n\n\t\t\t\t \n\t\t\t\t \t\n\t\t\t\t \t
  • 请运行代码,strip() 会处理\n\t\t\t\t .
  • 我复制粘贴了代码,它很好,但最后它来了{'Country': 'Edgewood,\t\t\t\t\t\t\t\n\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\tNY,\t\t\t\t\n\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\tUnited States'
  • 我再次编辑了帖子,以便您查看它的外观。
  • 我必须添加这个array.append([f.text.strip().replace("\xa0\n", "").replace("\t", "").replace("\n", "").replace(" ", "") for f in item.findAll("td")]) 似乎现在可以工作了!但是在这种情况下,我现在如何打印出国家等? (当然在循环之外)
【解决方案2】:

获得 GET 响应后,将其放入变量 (respString) 中,然后对其进行解析。我们的想法是通读 html 并确定信息的位置。

如果您的目标是 HTML 的这一部分:

<tr valign="top" class="odd">
   <td class="nowrap">
      United States
   </td>
   <td class="nowrap">
      22.08.2018
   </td>
   <td class="nowrap">
      8:19
   </td>
   <td>Shipment information received by UPS Mail Innovations</td>
</tr>

这应该让您从解析 HTML 中获得“美国”部分:

var startIndex = respString.indexOf('<td class="nowrap">');
var tempRespString = respString.substring(startIndex);
var tempStartIndex = tempRespString.indexOf('>');
var tempEndIndex = tempRespString.indexOf('</');
var country = tempRespString.substring(tempStartIndex + 1, tempEndIndex);

如果有多个相似的字符串并且您无法正确索引它 - 假设您需要定位第 3 个 ...

'<td class="nowrap">'

...然后你基本上找到第一个,在最后将其子串(切断该模式的第一次显示),然后做同样的事情并切断该模式的第二次显示),直到你找到正确的信息。

发挥创意并找到解析 HTML 响应所需数据的方法。

【讨论】:

  • 那不是 Javascript 吗?我正在使用 Python :'(
  • 是的,很抱歉。这实际上来自我的一个工作代码,它几乎完全符合您的要求。只需在 Python 中使用相同的逻辑......这是 indexOf 的syntax
  • 哦,好吧!我会试试看我能不能让它工作!非常感谢:)
猜你喜欢
  • 1970-01-01
  • 2014-10-19
  • 2013-08-26
  • 2011-11-18
  • 1970-01-01
  • 2018-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多